对Select WITHOUT WHERE或Order BY子句的结果排序



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

SELECT * FROM table_name

SELECT col1, col2 FROM table_name

将以什么顺序返回行?

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

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

我不太相信这是正确的。欢迎发表意见

谢谢,

Raj

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

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

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

最新更新