【问题标题】:Does clustered index sort order have impact on performance聚集索引排序顺序对性能有影响吗
【发布时间】:2014-12-05 23:26:13
【问题描述】:

如果表的 PK 是标准的自动增量 int (Id),并且检索和更新的记录几乎总是更接近最大 Id 的记录,那么是否对 PK 聚集索引进行排序会在性能方面产生任何差异升序还是降序?

创建此类 PK 时,SSMS 默认将索引的排序顺序设置为升序,并且由于访问次数最多的行总是更接近当前最大 Id 的行,我想知道将排序更改为降序是否会加快速度由于记录将自上而下而不是自下而上排序,并且靠近顶部的记录被最频繁地访问。

【问题讨论】:

  • 似乎没关系,Btree 中的索引告诉 SQL 从哪些页面获取数据。在这一点上,我认为排序的方向没有任何意义。
  • 要添加到 b-tree 响应中,触摸的页面数将相同 ASCDESC。当规范匹配查询 ORDER BY 子句时,DESC 通常是有益的。
  • this 相关,有几个很好的答案。

标签: sql sql-server sorting rdbms


【解决方案1】:

索引使用 B-tree 结构,所以不。但是如果您有一个基于多个列的索引,您希望在外部级别上最不同的列,而在内部级别上最不不同的列。例如,如果您有 2 列(性别和年龄),您会希望外部的年龄和内部的性别,因为只有 2 种可能的性别,而有更多的年龄。这会影响性能。

【讨论】:

  • 这恰恰相反:dba.stackexchange.com/questions/33196/…。它建议首先索引性别(平等测试),然后是年龄(范围测试)
  • @Anon 实际上,最佳答案声称它“无关紧要”。但我可以从我自己的经验告诉你,确实如此。你想要最挑剔的外表。不久前我有一个查询,我在一个临时表上反向索引,通过这样做,我将速度从大约 3 分钟降低到
  • @user3738391 仔细阅读它:它说如果两个谓词都是相等测试,而不是范围测试,这并不重要。在您的情况下{年龄,性别},年龄范围查询比性别范围查询更有可能。您的“优先选择更多”的想法是一个很好的经验法则,但是您选择了一个关于性别的坏例子,因为它永远不会被用作SELECT * WHERE Gender BETWEEN 'M' AND 'T' 它始终要么是平等测试,要么根本不是谓词,这意味着它应该是外部索引。
  • @anon 又错了。在该部分(“答案”部分)中,他们谈论的是 2 列索引,该索引测试 1 列是否相等,1 列作为范围,得出的结论是您首先索引相等,然后是范围。但这不是基于选择性。他们进入了一点点,他说“除此之外,如果两列都只有相等条件怎么办?”。他声称这“没关系”。这篇文章没有给出明确的答案!但我可以从个人经验告诉你,它确实有所作为。我已经在自己的查询中对其进行了测试。
  • 添加您的查询和解释将改善您的答案。目前,它与同一主题的其他评分较高的 SO 答案相矛盾。
【解决方案2】:

我认为不会对性能造成任何影响。因为,它将对要访问的索引键执行二进制搜索,然后使用该键执行特定数据块。无论哪种方式,二进制搜索都会达到O(log N) 的复杂性。所以总共O(log N) + 1 并且因为它是聚集索引,它实际上应该是O(log N) 时间复杂度;因为表记录是物理排序的,而不是单独的索引页/块。

【讨论】:

  • 如果我也在查询中使用 OrderByDescending (Id) 怎么办?
  • 对于单列索引,无论哪种方式都相同,但如果您将聚集索引定义为复合索引,那么它可能有意义。
猜你喜欢
  • 2012-11-16
  • 2010-11-30
  • 2012-09-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多