【问题标题】:Clustered Index and Sorting聚集索引和排序
【发布时间】:2021-11-24 01:11:06
【问题描述】:

如果您运行以下查询,例如,行可以按任何顺序返回:

select *
from [table_a];

聚集索引根据您选择的任何列对表进行排序。

话虽如此,如果我在 [column_a], [column_b], and [column_c] 上有一个聚集索引并从上面运行相同的查询,那么数据是否总是会根据该顺序返回,因为这是创建聚集索引的顺序?

更多说明:

如果我在索引中没有的东西上添加ORDER BY 子句,执行计划将有一个排序运算符。

如果我在聚集索引中使用的所有列上都有一个ORDER BY 子句,则执行计划将没有排序运算符。

这就是我首先提出这个问题的原因。

【问题讨论】:

标签: sql-server tsql indexing clustered-index


【解决方案1】:

注意:问题是交叉发布的here

如果我在 [column_a]、[column_b] 和 [column_c] 上有一个聚集索引并从上面运行相同的查询,那么数据总是会根据该顺序返回,因为这是聚集索引的顺序创建于?

没有。

SQL Server 不保证它将以任何顺序返回数据除非您指定顺序。只需创建一个覆盖不同列的非聚集索引,就很容易证明事情可能会出错:

但是事情也可以通过其他方式横向发展,例如。当并行性或分区发挥作用并且 SQL Server 重新组合来自不同线程的数据时,或者当查询变得更加复杂时,使用连接或过滤器以及除聚集索引扫描之外的不同计划是有意义的。省略 order by 子句是在告诉 SQL Server:“我不关心顺序。”

另外,澄清一点:

如果我对聚集索引中使用的所有列都有 ORDER BY 子句,则执行计划将没有排序运算符。

...仅当列以与键定义完全相同的顺序列出时才适用。 ORDER BY c, b, a 是“所有列”,但它显然会产生不同的输出(并且需要某种类型的排序操作才能到达那里)。

如果您希望并且希望对依赖某个顺序感到满意,请始终使用 ORDER BY 子句。

进一步阅读:

【讨论】:

    【解决方案2】:

    SQL 报告的经验法则是,如果您希望结果集按特定顺序排列,那么您总是需要添加适当的ORDER BY 子句。现在,SQL Server 可能会选择按column_acolumn_bcolumn_c 的顺序扫描索引,因此按该顺序返回结果,但没有保证 这会发生。但是,如果您使用以下查询:

    SELECT *
    FROM [table_a]
    ORDER BY [column_a], [column_b], [column_c];
    

    然后应该使用与上述ORDER BY 子句相同的顺序在三列上的索引,并且可以说覆盖整个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 2013-08-07
      • 2021-01-14
      • 2021-09-07
      • 2019-09-12
      • 1970-01-01
      • 2016-01-05
      相关资源
      最近更新 更多