sql - 为 SQL Server 表选择最佳索引

标签 sql sql-server indexing query-optimization

我有一个具有以下结构的 SQL Server 表:

CREATE TABLE [dbo].[Log](
 [LogID] [bigint] IDENTITY(1,1) NOT NULL,
 [A] [int] NOT NULL,
 [B] [int] NOT NULL,
 [C] [int] NOT NULL,
 [D] [int] NOT NULL,
 [E] [int] NOT NULL,
 [Flag1] [bit] NOT NULL,
 [Flag2] [bit] NOT NULL,
 [Flag3] [bit] NOT NULL,
 [Counter] [int] NOT NULL,
 [Start] [datetime] NOT NULL,
 [End] [datetime] NOT NULL)

该表用于记录事件。 A-E 列表示外键,Flag1-Flag3 表示某些日志状态,Start 列End 标记事件的开始和结束。

平均而言,该表每约 30 秒更新一次,更新会进行约 50 次插入/更新。

用户可以从 UI 进行查询并过滤任何给定列以及列和列类型的所有组合上的数据。

优化该表数据检索的最佳方法是什么:

  1. 创建一个“主”索引来保存所有这些列
  2. 确定一些最常用的过滤器组合,例如[A,D,E]、[A, Start, End] 等并为它们创建索引
  3. 还有别的事...

最佳答案

我怀疑这里的任何人都只能猜测 - 您需要记录表的使用情况,并从该使用情况中查看正在查询哪些列组合。

  1. Create one "master" index that would hold all these columns

这绝对不是一个好主意 - 如果您在 (A,B,C,D,E) 上有一个索引,并且您通过 B 和 D 的值限制查询,则该索引完全是无用。只是有用而已

  • 如果您经常按所有五列进行查询
  • 经常使用 (A,B)、(A,B,C)、(A,B,C,D) 等组合

在任何其他情况下,这都是一种浪费 - 不要使用它。

  1. Identify some of the most used filter combinations e.g. [A,D,E], [A, Start, End] etc. and create indexes for them

是的,这确实是保证成功的唯一方法。您需要查看实际发生的查询类型,然后进行调整。

关于sql - 为 SQL Server 表选择最佳索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064996/

相关文章:

python - 存储 Django 模型类型和从 SQL 数据库高效读取的最佳方式

sql - 如何在数据库Oracle中选择工资第二高的记录?

sql-server - SQL Server 2005 数字精度损失

mysql - SQL 索引性能 - ASC 与 DESC

python - 在数据框中分隔特定值

sql - 如何从 SQL Server 中的表中获取 50% 的记录?

mysql - SQL多查询

mysql - 数据库表设计问题

sql-server - FOR XML ... TYPE 比 FOR XML 慢多少?

OR 运算符中的 MySQL 性能