关于综合指数的建议

时间:2012-11-26 15:50:04

标签: sql-server tsql indexing sql-server-2012 composite-index

我有一个巨大的(数百万行)表,其中包含以下列:

[When] datetime2(0),
[What] tinyint,
[Who] bigint

它基本上是一个事件表('What'),一次发生在各个实体('Who')上('When')。 “什么”有大约10个不同的值 - 它是枚举。目前“谁”有大约10,000个值。

我希望能够查询此表,询问某个时间段之间某个实体是否发生了某些事情。例如,在[When ='2012-10-01'到'2012-11-01']之间,[Who = 0,1,2,3]发生了[What = 0,1,2,3]。< / p>

我正在寻找有关如何最好地索引此表的建议。我很确定复合索引是可行的方法,但我不确定确切的配置。例如,列顺序应该是什么?我已经读过“最具选择性”的列应该向左移动,我认为在这种情况下会是[When],[Who],[What]。这是对的吗?

很抱歉,如果这个问题看起来很模糊,但我对任何意见都表示感谢。我正在使用SQL Server 2012。

1 个答案:

答案 0 :(得分:5)

关于将最具选择性的列放在左边的神话是垃圾 - 对不起。

只有使用n个最左边的参数,例如,复合索引才有用。如果你有索引

(when, who, what)

然后该索引可以回答询问的问题

(when)

或关于

(when, who)

甚至是

(when, who, what)

无法回答有关

的问题
(who, what)

因为这里没有使用最左边的列)。

这应该是您考虑的要点 - 以这样的方式排列列,以便您可以使用这样的复合索引回答大部分问题。