Sql 聚集索引排序顺序对性能有影响吗

Sql 聚集索引排序顺序对性能有影响吗,sql,sql-server,sorting,rdbms,Sql,Sql Server,Sorting,Rdbms,如果表的主键是标准的自动递增int(Id),并且检索和更新的记录几乎总是接近max Id的记录,那么主键聚集索引是否按升序或降序排序会对性能产生影响 创建这样的PK时,SSMS默认将索引的排序顺序设置为升序,并且由于访问最多的行总是更接近当前最大Id的行,我想知道将排序改为降序是否会加快检索速度,因为记录将自上而下排序,而不是自下而上排序,接近顶部的记录访问频率最高。索引使用B-树结构,所以不是。但是如果您有一个基于多个列的索引,您希望外部级别上的列最清晰,内部级别上的列最不清晰。例如,如果您有

如果表的主键是标准的自动递增int(Id),并且检索和更新的记录几乎总是接近max Id的记录,那么主键聚集索引是否按升序或降序排序会对性能产生影响


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

索引使用B-树结构,所以不是。但是如果您有一个基于多个列的索引,您希望外部级别上的列最清晰,内部级别上的列最不清晰。例如,如果您有两列(性别和年龄),您可能希望外部显示年龄,内部显示性别,因为只有两种可能的性别,而年龄要多得多。这将影响性能。

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

这似乎无关紧要,因此Btree中的索引会告诉SQL从哪些页获取数据。在这一点上,我认为排序的方向不会有任何关联。要添加到b树响应中,所接触的页数将是相同的
ASC
DESC
DESC
通常在规范匹配查询
ORDER BY
子句时非常有用。与之相关的有两个非常好的答案。如果我也使用OrderByDescending(Id)呢在我的查询中?对于单列索引,这两种方式都是相同的,但如果将聚集索引定义为复合索引,则可能有意义。这表示相反:。它建议先对性别(平等性测试)进行索引,然后对年龄(范围测试)进行索引@Anon实际上,最重要的答案声称这“无关紧要”。但我可以从我自己的经验告诉你,确实如此。你想要最有选择性的外表。不久前,我有一个查询,我在一个临时表上有反向索引,通过这样做,我将速度从~3分钟降低到@user3738391,更仔细地阅读它:它说两个谓词是否都是相等测试,而不是范围测试并不重要。在您的案例{age,gender}中,年龄范围查询比性别范围查询更有可能。你的“更具选择性的优先”想法是一个很好的经验法则,但你选择了一个关于性别的坏例子,因为它永远不会被用作
SELECT*,其中性别在'M'和'T'之间。
它总是一个等式测试,或者根本不是谓词,这意味着它应该是外部索引。@anon又错了。在该部分(“答案”部分)中,他们讨论了一个2列索引,该索引测试1列的相等性,1列作为一个范围,并得出结论,首先索引相等性,然后是范围。但这并不是基于选择性。他们把它放低一点,他说“除此之外,如果两列都只有相等的条件呢?”。他声称这“无关紧要”。这篇文章没有给出明确的答案!但我可以从个人经验告诉你,这确实会有所不同。我已经在自己的查询中进行了测试。添加您的查询和解释将改进您的答案。目前,它与其他评分较高的答案相矛盾,所以答案是相同的。