为SQL Server表选择最佳索引

Ton*_*ola 7 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)
Run Code Online (Sandbox Code Playgroud)

该表用于记录活动.列A- E表示外键,Flag1- Flag3表示某些日志状态,列StartEnd标记活动的开始和结束.

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

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

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

  1. 创建一个包含所有这些列的"主"索引
  2. 确定一些最常用的过滤器组合,例如[ A,D,E],[ A, Start, End]等,并为它们创建索引
  3. 别的......

mar*_*c_s 11

我怀疑这里的任何人都可以做出任何猜测 - 您需要记录表的用法并从该用法中查看正在查询的列组合.

  1. 创建一个包含所有这些列的"主"索引

这绝对不是一个好主意 - 如果你有一个索引(A,B,C,D,E)并且你用B和D的值限制你的查询,那么这个索引就完全没用了.它只是有用的

  • 如果您经常查询所有五列
  • 通过组合如(A,B),(A,B,C),(A,B,C,D)

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

  1. 确定一些最常用的滤波器组合,例如[A,D,E],[A,Start,End]等,并为它们创建索引

是的,这确实是承诺任何成功的唯一方式.您需要查看实际发生的查询类型,然后对其进行调整.