2012-10-02 51 views
2

我有一個表(我們稱之爲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並加快表掃描。

回答

0

你應該VACUUM ANALYZE您的原始表。 (可能需要完整的VACUUM)。由於新表是一次創建和填充的,它們形成或多或少連續的「塊」,而原始表的元組遍佈磁盤。

+0

是的,我還要求DBA嘗試一下,希望它能起作用。但我從「pg_stat_all_tables」中想到,它表示autovacuum在刪除後已經完成了。你知道自動/手動真空有什麼區別嗎? –

+0

單獨的手動真空不會做更多的事情。但VACUUM ANALYZE將重建查詢計劃優化。 – mbarthelemy

+0

VACUUM FULL做的伎倆...謝謝,dezso。 –