【发布时间】:2011-09-14 08:05:50
【问题描述】:
我正在研究 postgresql 中的表之间的差异,这需要很长时间,因为每个表约为 13GB... 我目前的查询是:
SELECT * FROM tableA EXCEPT SELECT * FROM tableB;
和
SELECT * FROM tableB EXCEPT SELECT * FROM tableA;
当我对两个(未索引的)表进行比较时,需要 1:40 小时(1 小时 40 分钟)为了获得新行和已删除行,我需要运行两次查询,从而获得总时间到 3:30。
我对它运行了 Postgresql EXPLAIN 查询以查看它在做什么。看起来它正在对第一个表进行排序,然后是第二个表,然后比较它们。好吧,这让我想到,如果我对表进行索引,它们将被预先排序,并且差异查询会更快。
索引每个表需要 45 分钟。索引后,每个 Diff 需要 1:35 小时。 为什么索引只将总差异时间缩短 5 分钟?我会假设它会超过一半,因为在未索引的查询中,我对每个表进行了两次排序(我需要运行两次查询)
由于其中一个表不会有太大变化,因此只需索引一次,另一个将每天更新。所以索引方法的总运行时间是索引的 45 分钟,加上 diff 的 2x 1:35,总共 3:55 小时,差不多 4 小时。
我在这里做错了什么,我看不出为什么我的净差异时间比没有它的索引大?
这里稍微引用了我的另一个问题:Postgresql UNION takes 10 times as long as running the individual queries
编辑: 这是两个表的架构,除了表名之外它们是相同的。
CREATE TABLE bulk.blue
(
"partA" text NOT NULL,
"type" text NOT NULL,
"partB" text NOT NULL
)
WITH (
OIDS=FALSE
);
【问题讨论】:
-
报告
explain analyze将非常有帮助,并且在您进行更改后进行比较分析时应该始终这样做。例如,它会表明您在添加索引后仍然没有使用它们。顺便说一句,一旦您使用了正确的查询,对索引进行聚类会使其工作得更快。
标签: performance postgresql indexing diff