排序选择WITHOUT WHERE或ORDER BY子句的结果顺序

时间:2011-12-23 06:49:44

标签: sql-server tsql

我有一个带有PK聚簇索引的表以及其上的其他索引,包括唯一和非唯一。如果我发出(确切地说):

SELECT * FROM table_name

SELECT col1, col2 FROM table_name

将以什么顺序返回行?

这是客户转发给我们的访问调查问卷中的第一个问题。以下是说明:

如果此问题的答案不正确,请立即终止面试!个人,无论其声明的能力如何,都不了解基于SQL的关系数据库管理系统。这是过去25年多来的SQL-101逻辑。正确答案是:“未知/随机/未确定,因为没有将ORDER BY子句指定为查询的一部分”。

我不知道这确实是正确的。欢迎所有评论。

谢谢,

拉​​吉

2 个答案:

答案 0 :(得分:8)

即使表具有主键/聚簇索引,也无法确定行的顺序。虽然在执行计划中最后会有一个索引/堆扫描,但如果在许多核心上并行执行查询,则由于并行流合并计划步骤,生成的数据集不会被排序。

您可能无法在小型数据库上看到它,但尝试在单独的硬盘上创建一个包含许多文件的文件,并在多核计算机上运行简单查询。很可能你会得到结果" partialy sorted"通过ID - 即将存在对行进行排序的块,但将以半随机顺序检索块。

答案 1 :(得分:5)

指令在概念级别与SQL对话,查询的结果是关系,关系是无序的。从概念转向实际,SQL标准中没有定义隐式排序的原因是RDBMS可以自由地返回任何最有效的顺序。