查询计划是否始终提供相同的结果顺序?

时间:2014-03-20 17:31:35

标签: postgresql sql-execution-plan

对于没有order by子句的查询,给定的查询计划是否总是以相同的顺序返回结果?我知道可以选择不同的计划,但是如果选择相同的计划,那么会给出相同的结果顺序吗?从本质上讲,查询执行者在执行给定计划时必须对行重新排序有什么自由?

1 个答案:

答案 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的任何订单。