我有一个表,上面有一个PK聚集索引以及其他索引,包括唯一的和非唯一的。如果我发出(确切地):
SELECT * FROM table_name
或
SELECT col1, col2 FROM table_name
将以什么顺序返回行?
这是客户转发给我们的访谈问卷中的第一个问题。以下是使用说明:
如果这个问题的答案是错误的,立即终止面试!无论个人的能力如何,他们都不理解基于sql的关系数据库管理系统。这是过去25多年的SQL-101逻辑。正确的答案是:"未知/随机/未确定,因为没有指定ORDER BY子句作为查询的一部分"。
我不太相信这是正确的。欢迎发表意见
谢谢,
Raj
即使表有主键/聚集索引,您也无法确定行顺序。虽然在执行计划中,最后会有一个索引/堆扫描,但如果查询在多个核心上并行执行,则由于并行流合并计划步骤,结果数据集将不会被排序。
您可能不会在小型数据库上看到它,但是尝试在单独的硬盘上创建一个包含许多文件的数据库,并在多核机器上运行一个简单的查询。最有可能的是,你会得到的结果"部分排序"的ID -即会有块的行排序,但块将以半随机顺序检索。
这些指令在概念层面上与SQL对话,在概念层面上,查询的结果是一个关系,而关系是无序的。从概念到实际,SQL标准中没有定义隐式排序的原因是,rdbms可以自由地返回任何对其实现最有效的顺序。