我有一個表PosgreSQL 9.1.9
。有一個架構:如何防止更改執行計劃某些值
CREATE TABLE chpl_text
(
id integer NOT NULL DEFAULT nextval('chpl_text_id_seq1'::regclass),
page_id bigint NOT NULL,
page_idx integer NOT NULL,
...
);
我在這張表中有大約40000000行(40M)。 現在,有一個查詢:
SELECT
...
FROM chpl_text
ORDER BY id
LIMIT 100000
OFFSET N
一切順利爲N <= 5300000
。執行計劃看起來像這樣
Limit (cost=12743731.26..12984179.02 rows=100000 width=52)
-> Index Scan using chpl_text_pkey on chpl_text t (cost=0.00..96857560.86 rows=40282164 width=52)
但N >= 5400000
奇蹟般地變成
Limit (cost=13042543.16..13042793.16 rows=100000 width=52)
-> Sort (cost=13029043.16..13129748.57 rows=40282164 width=52)
Sort Key: id
-> Seq Scan on chpl_text t (cost=0.00..1056505.64 rows=40282164 width=52)
在很長的運行時間由此而來。
如何防止postresql更改更高偏移量的查詢計劃?
注意:我知道,大的補償不是很好,但我不得不在這裏使用它們。
您使用的是默認配置值嗎?您應該嘗試增加work_mem和其他內存相關參數的大小。 –
根據postgres DOC(http://www.postgresql.org/docs/9.1/static/sql-select.html#SQL-LIMIT),這是預期的。在這裏看到類似的帖子http://dba.stackexchange.com/questions/32956/execution-plan-in-simple-query-in-pgsql-depends-on-offset-clause-why。 – Rahul
你可以用EXPLAIN(ANALYZE,BUFFERS)重複這些嗎? – jjanes