【问题标题】:SQL Server will index help hereSQL Server 将在此处索引帮助
【发布时间】:2011-03-08 15:08:00
【问题描述】:

我有一个包含 A、B、C、D 和 E 列的表。A 上当前有一个聚集索引(主键,唯一标识符)。

我经常在 A、B 和 C 列上进行选择(即 A=?? and B=?? and C=??)。我也经常只对 A 进行选择,而对 A、B 和 D 进行其他选择。

聚集索引对查询的不仅仅是 A 列的选择有什么优势?

作为具有大量行和 UUID 作为主键的表的一般经验法则,我是否应该在所有常用的选择列组合上使用非聚集索引并在 PK 列上使用聚集索引?

注意:我使用的是 SQL Server 2005。

【问题讨论】:

  • @Joda Maki - SO 上有称为支持的功能。不要看到你已经在你提出的 43 个问题中尝试过。 stackoverflow.com/privileges/vote-up
  • 对此没有明确的规则。是的,这些索引可能会有所帮助 - 或没有,这取决于您的查询和基础数据的真实情况。你需要 1) 衡量你当前的表现,然后 2) 做出改变(例如引入一个明显的指标),然后 3) 再次衡量,看看你是否得到了改进。
  • 阅读Kimberly Tripp's blog post 了解为什么 GUID 会产生非常差的集群键(并且默认情况下,表上的主键是集群键 - 除非您已经知道这一点并专门更改了该默认值行为)
  • @Sachin:你必须注册才能投票
  • @Sachin:是的,但如果我愿意,它也会要求我注册。 SO 最有用的事情之一是您无需注册即可使用它。

标签: sql-server sql-server-2005


【解决方案1】:

由于您已经在 A 上拥有聚集索引,因此您只能在其他列 B 和 C 上拥有非聚集索引。您在 where 子句中使用的列。这肯定有助于减少查询执行时间。

请记住,每个表只能有一个聚集索引,默认情况下,您的主键列将被聚集索引。

【讨论】:

  • 在 A 上使用非聚集索引,在 B 上使用非聚集索引会有所帮助,还是仅在联合 BC 上使用非聚集索引有帮助?
  • @Joda Maki - 您应该将聚集索引保留在 A 上。在 B、C 和 D 上有非聚集索引。您在 WHERE 子句中经常使用的列。
  • @Joda Maki - 在聚集索引键上放置非聚集索引无论如何都会被 SQL Server 忽略。聚集键包含在所有非聚集索引中。
  • 对不起,我是说上面的B和C,不是A和B
【解决方案2】:

A 是唯一标识符和具有聚集索引的主键。这是最快的速度。对于您有 B 和 C 或 B 和 D 的查询,聚集索引对您没有帮助,但原因是额外的列对于查询是多余的;你只是不需要它们。仅 A 就足以确定您的结果集,而 A 是您可以运行的最快查询。包含您的其他列的索引只会在您有不涉及 A 的查询时为您提供帮助。

【讨论】:

  • 说我在 AB 上有一个聚集索引。会像“where B=??”这样的查询吗?从组合列索引中受益?
  • @Joda Maki:不。如果您在(A,B) 上有索引,则使用A=xxA=xx AND B=yy 的查询将受益 - 但不是 仅使用B=yy 的查询
  • @marc_s:为什么 A=xx 的查询会受益但 B=yy 不会?
  • @Joda Maki:因为索引中列的顺序;如果您有(A,B),那么仅使用(A)或同时使用(A,B)的查询将受益 - 但只是(B)不能 - 索引位于(A,B)上,所以它无济于事仅用于 (B) (每个索引条目实际上是 (A,B) 的组合 - 如果您正在寻找特定的 A'^s 或 A+B's,这会有所帮助 - 但它对 B's 没有帮助)
  • @Joda Maki:不知道你来自哪里——但想象一下电话簿;它通常按(LastName, FirstName) 排序。有了这个,你可以很快找到Coehoorn - 然后在这些条目中找到John。但是,当您搜索所有 David 时,典型的电话簿确实对您没有帮助,因为索引位于 (LastName, FirstName) .....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2015-01-19
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多