聚类索引和排序



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

select *
from [table_a];

一个聚集索引表基于任何你选择的列(s)。

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

更澄清:

如果我在索引之外的东西上添加ORDER BY子句,执行计划将有一个排序操作符。

如果我在聚集索引中使用的所有列上都有ORDER BY子句,则执行计划将不包含排序操作符。

这就是为什么我一开始就问这个问题。

注意:问题交叉贴在这里

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

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

  • db&lt例子;在小提琴

但是事情也可能以其他方式偏离方向,例如,当并行或分区发挥作用时,SQL Server重新组装来自不同线程的数据,或者当查询使用连接或过滤器变得更复杂时,使用不同的计划而不是集群索引扫描是有意义的。去掉order by子句是在告诉SQL Server:"我不关心顺序。">

同时,作为一个澄清点:

如果我在聚集索引中使用的所有列上都有ORDER BY子句,则执行计划将不包含排序操作符。

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

如果你期望并且想要舒适地依赖于某种顺序,那么总是使用order BY子句。

进一步阅读:

  • 没有安全带-期望订单没有命令BY (Conor Cunningham)
  • 如果没有ORDER BY,则没有默认排序顺序。(亚历山大"库兹涅佐夫")
  • T-SQL星期二#56:SQL Server假设(我-见#3)
  • 要改掉的坏习惯:依赖未记录的行为(也包括我)
  • 为什么SSMS在表的顶部而不是底部插入新行?(dba。se问题)

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

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

则在三列上建立索引,顺序与上面的ORDER BY子句相同,并且可以说覆盖整个查询。

最新更新