我有一张桌子(我们称之为 table_a)。它有大约 1500 万行。这是一个具有主键的简单表。
最近我创建了一个备份表(我们称之为 table_a_bkp)并从 table_a 中移动了 1200 万行。我使用简单的 SQL(删除/插入)来执行任务。两个表具有相同的结构并使用相同的表空间。
即使总数据行减少到 2+ 百万,table_a 的查询速度也没有提高。事实上 table_a_bkp(12m 行) 的查询速度甚至比 table_a(2m 行) 还要快。
使用 pg_stat_all_tables 检查了两个表,这两个表似乎都是在执行删除后自动清理和分析。
我预计 table_a 查询速度应该会提高,因为它现在获得的数据要少得多......
数据库版本:Linux 上托管的 PostgreSQL 9.1
解释(备份表比第一个表快,即使行大得多):
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 确实加快了表扫描。