我有一个巨大的(数百万行)表,其中包含以下列:
[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。
答案 0 :(得分:5)
关于将最具选择性的列放在左边的神话是垃圾 - 对不起。
只有使用n个最左边的参数,例如,复合索引才有用。如果你有索引
(when, who, what)
然后该索引可以回答询问的问题
(when)
或关于
(when, who)
甚至是
(when, who, what)
但无法回答有关
的问题(who, what)
(因为这里没有使用最左边的列)。
这应该是您考虑的要点 - 以这样的方式排列列,以便您可以使用这样的复合索引回答大部分问题。