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

Raj*_*Raj 5 t-sql sql-server

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

SELECT * FROM table_name
Run Code Online (Sandbox Code Playgroud)

要么

SELECT col1, col2 FROM table_name
Run Code Online (Sandbox Code Playgroud)

以什么顺序返回行?

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

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

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

谢谢,

拉吉

Mag*_*tLU 8

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

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


out*_*tis 5

这些指令在概念层面上与SQL对话,在该层面上,查询的结果是关系,而关系是无序的.从概念到实际,在SQL标准中没有定义隐式排序的原因是RDBMS可以自由地返回对它们的实现最有效的任何顺序.