4

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

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

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

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

我正在寻找有关如何最好地索引此表的建议。我相当确定复合索引是要走的路,但我不确定确切的配置。例如,列顺序应该是什么?我读过“最有选择性”的列应该放在左边,我认为在这种情况下应该是 [When]、[Who]、[What]。它是否正确?

抱歉,如果这个问题看起来含糊不清,但我将不胜感激。我正在使用 SQL Server 2012。

4

1 回答 1

5

关于把最有选择性的列放在左边的神话是废话——对不起。

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

(when, who, what)

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

(when)

或大约

(when, who)

甚至大约

(when, who, what)

但它不能回答关于

(who, what)

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

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

于 2012-11-26T16:10:59.663 回答