我正在对 postgresql 中的表进行比较,这需要很长时间,因为每个表大约有 13GB... 我当前的查询是:
SELECT * FROM tableA EXCEPT SELECT * FROM tableB;
和
SELECT * FROM tableB EXCEPT SELECT * FROM tableA;
当我对两个(未索引的)表进行比较时,需要 1:40 小时(1 小时 40 分钟)为了同时获取新行和删除的行,我需要运行查询两次,使总时间到 3:30 小时。
我对它运行 Postgresql EXPLAIN 查询以查看它在做什么。看起来它正在对第一个表进行排序,然后对第二个表进行排序,然后比较它们。好吧,这让我想到,如果我为表编制索引,它们将被预排序,并且 diff 查询会快得多。
为每个表编制索引需要 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
);
最佳答案
在上面的语句中,您没有使用索引。
你可以这样做:
SELECT * FROM tableA a
FULL OUTER JOIN tableB b ON a.someID = b.someID
然后您可以使用相同的语句来显示哪些表有缺失值
SELECT * FROM tableA a
FULL OUTER JOIN tableB b ON a.someID = b.someID
WHERE ISNULL(a.someID) OR ISNULL(b.someID)
这应该为您提供表 A 或表 B 中缺少的行
关于performance - 我怎样才能加快表之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337871/