2

我有一张桌子(我们称之为 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 确实加快了表扫描。

4

1 回答 1

0

你应该VACUUM ANALYZE你原来的表。(可能需要一个完整VACUUM的表。)由于新表是同时创建和填充的,它们形成或多或少连续的“块”,而原始表的元组分布在整个磁盘上。

于 2012-10-02T06:39:04.673 回答