テーブルがあります (table_a と呼びましょう)。約1500万行になりました。主キーを持つ単純なテーブルです。
最近、バックアップ テーブル (table_a_bkp と呼びましょう) を作成し、table_a から 1,200 万行を移動しました。単純な SQL (削除/挿入) を使用してタスクを実行しました。両方のテーブルは同じ構造を持ち、同じテーブルスペースを使用します。
table_a のクエリ速度は、合計データ行が 200 万行以上に減っても改善されません。実際、table_a_bkp(12m 行) は、table_a(2m 行) よりもクエリ速度が高速です。
pg_stat_all_tables でチェックした 2 つのテーブルは両方とも、削除が実行された後に自動バキュームと分析のようです。
table_a クエリの速度が向上するはずだと思っていましたが、今ではデータがはるかに少なくなりました...
DB バージョン : Linux でホストされている PostgreSQL 9.1
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"
解決済み: VACUUM FULL がテーブル スキャンを高速化しました。