我有一個表(我們稱之爲table_a)。它有大約1500萬行。這是一個簡單的表格,它有一個主鍵。行刪除後postgreSQL表查詢速度沒有提高
最近,我創建了一個備份表(我們稱之爲table_a_bkp),並從table_a移動了1200萬行。 我用簡單的SQL(刪除/插入)來執行任務。 兩個表具有相同的結構並使用相同的表空間。
即使總數據行減少到2百萬個,table_a的查詢速度也不會提高。 事實上,table_a_bkp(12m行)甚至比table_a(2m行)的查詢速度更快。
經過與pg_stat_sys_tables和pg_stat_all_tables兩個表都好像自動真空&缺失進行分析後。
我預期的那樣得到了它少得多的數據現在表-A查詢速度有待提高......
DB版本:PostgreSQL的9.1託管在Linux上
EXPLAIN(備份表比第一次更快的錶行,即使是大得多):
EXPLAIN (ANALYZE TRUE, COSTS TRUE, BUFFERS TRUE) select count(*) from txngeneral
"Aggregate (cost=742732.94..742732.95 rows=1 width=0) (actual time=73232.598..73232.599 rows=1 loops=1)"
" Buffers: shared hit=8910 read=701646"
" -> Seq Scan on txngeneral (cost=0.00..736297.55 rows=2574155 width=0) (actual time=17.614..72763.873 rows=2572550 loops=1)"
" Buffers: shared hit=8910 read=701646"
"Total runtime: 73232.647 ms"
EXPLAIN (ANALYZE TRUE, COSTS TRUE, BUFFERS TRUE) select count(*) from txngeneral_bkp
"Aggregate (cost=723840.13..723840.14 rows=1 width=0) (actual time=57134.270..57134.270 rows=1 loops=1)"
" Buffers: shared hit=96 read=569895"
" -> Seq Scan on txngeneral_bkp (cost=0.00..693070.30 rows=12307930 width=0) (actual time=5.436..54889.543 rows=12339180 loops=1)"
" Buffers: shared hit=96 read=569895"
"Total runtime: 57134.321 ms"
解決:真空FULL並加快表掃描。
是的,我還要求DBA嘗試一下,希望它能起作用。但我從「pg_stat_all_tables」中想到,它表示autovacuum在刪除後已經完成了。你知道自動/手動真空有什麼區別嗎? –
單獨的手動真空不會做更多的事情。但VACUUM ANALYZE將重建查詢計劃優化。 – mbarthelemy
VACUUM FULL做的伎倆...謝謝,dezso。 –