【问题标题】:Advice on composite index综合指数建议
【发布时间】:2012-11-14 03:12:59
【问题描述】:

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

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

它基本上是一个事件表(“什么”),一次发生在不同的实体(“谁”)(“何时”)。 '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。

【问题讨论】:

  • 向我们展示您拥有的索引。然后运行几个查询并查看执行计划。
  • 这还取决于您在典型日期范围内会发生多少事件。

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


【解决方案1】:

关于将最有选择性的列放在左边的神话是废话 - 抱歉。

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

上有索引
(when, who, what)

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

(when)

或关于

(when, who)

甚至是关于

(when, who, what)

但它不能回答有关

的问题
(who, what)

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

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

【讨论】:

  • 谢谢,这很有意义。从查询的角度来看,在我的场景中,列顺序似乎没有太大区别。碎片化怎么办?通常,新行总是会有更高的 [When],但显然 [Who] 和 [What] 不会那么可预测。将 [When] 作为第一列会减少碎片,还是 - 再次 - 没有真正的区别?再次感谢。
  • 在这个例子中,你搜索所有三列,我不同意把最有选择性的列放在左边是废话。
  • @Barguast:(希望/可能)稳定增加第一列可能是有益的,因为它将需要更少的“乱序”插入,从而减少页面拆分。
  • @Eduardo:见 Myth: Most selective column at first positionIndex columns, selectivity and equality predicates - 这是一个记录在案的(并且非常持久)神话 - 但它没有真相。
  • @marc_s:你说得对,我学到了一些非常有用的东西;谢谢+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2015-12-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多