例如,如果运行以下查询,则行可以以任何顺序返回:
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<例子;在小提琴
但是事情也可能以其他方式偏离方向,例如,当并行或分区发挥作用时,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_a
、column_b
和column_c
的顺序扫描索引,并因此按该顺序返回结果,但是没有保证会发生。但是,如果您使用以下查询:
SELECT *
FROM [table_a]
ORDER BY [column_a], [column_b], [column_c];
则在三列上建立索引,顺序与上面的ORDER BY
子句相同,并且可以说覆盖整个查询。