performance - 我怎样才能加快表之间的差异?

标签 performance postgresql indexing diff

我正在对 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/

相关文章:

php - 当安全性不受威胁时,php 中可用的最高性能散列算法是什么?

python - 并行速度

sql - 树木 : Calculate the cost of 2 paths and determine which is more expensive

c - 如何对 PostgreSQL C 语言函数进行单元测试

MySQL索引设计与表分区

iphone - 什么时候值得缓存 UIImage 资源?

sql - 在 postgres 中,ORDER BY 似乎在递归 cte 中不起作用

mysql - Sphinx,更新已删除条目的索引

安卓适配器 "java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4"

mysql - 用户界面自动完成 : Make multiple ajax requests or load all data at once for a list of locations in a city?