对于没有order by子句的查询,给定的查询计划是否总是以相同的顺序返回结果?我知道可以选择不同的计划,但是如果选择相同的计划,那么会给出相同的结果顺序吗?从本质上讲,查询执行者在执行给定计划时必须对行重新排序有什么自由?
答案 0 :(得分:2)
不,即使没有计划更改,也不会以相同的顺序返回结果。 查询执行程序不必重新排序行,它甚至不首先对它们进行排序。
例如,当行按磁盘顺序排列时:
CREATE TABLE o(id int);
INSERT INTO o VALUES (1),(2),(3);
ANALYZE o;
EXPLAIN SELECT * FROM o;
QUERY PLAN
-------------------------------------------------
Seq Scan on o (cost=0.00..1.03 rows=3 width=4)
SELECT * FROM o;
结果:
id ---- 1 2 3
让我们更新一行(甚至不更改值):
UPDATE o SET id=2 WHERE id=2;
并重新运行相同的选择:
SELECT * FROM o;
id ---- 1 3 2
注意订单的变化情况。当然,计划仍然是相同的:
EXPLAIN SELECT * FROM o;
QUERY PLAN
-------------------------------------------------
Seq Scan on o (cost=0.00..1.03 rows=3 width=4)
结论:执行计划并不意味着没有order by
的任何订单。