聚集索引和排序

Chi*_*les -1 index sql-server clustered-index t-sql

select *
from [table_a];
Run Code Online (Sandbox Code Playgroud)

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

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

更多说明:

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

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

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

Aar*_*and 7

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

不。

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

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

另外,作为澄清一点:

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

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

如果您希望并希望能够轻松地依赖特定顺序,请始终使用 ORDER BY 子句。

进一步阅读:

之前的问题在这里: