我有一个带有PK聚簇索引的表以及其上的其他索引,包括唯一和非唯一。如果我发出(确切地说):
SELECT * FROM table_name
或
SELECT col1, col2 FROM table_name
将以什么顺序返回行?
这是客户转发给我们的访问调查问卷中的第一个问题。以下是说明:
如果此问题的答案不正确,请立即终止面试!个人,无论其声明的能力如何,都不了解基于SQL的关系数据库管理系统。这是过去25年多来的SQL-101逻辑。正确答案是:“未知/随机/未确定,因为没有将ORDER BY子句指定为查询的一部分”。
我不知道这确实是正确的。欢迎所有评论。
谢谢,
拉吉
答案 0 :(得分:8)
即使表具有主键/聚簇索引,也无法确定行的顺序。虽然在执行计划中最后会有一个索引/堆扫描,但如果在许多核心上并行执行查询,则由于并行流合并计划步骤,生成的数据集不会被排序。
您可能无法在小型数据库上看到它,但尝试在单独的硬盘上创建一个包含许多文件的文件,并在多核计算机上运行简单查询。很可能你会得到结果" partialy sorted"通过ID - 即将存在对行进行排序的块,但将以半随机顺序检索块。
答案 1 :(得分:5)
指令在概念级别与SQL对话,查询的结果是关系,关系是无序的。从概念转向实际,SQL标准中没有定义隐式排序的原因是RDBMS可以自由地返回任何最有效的顺序。