如何加快表之间的差异?

时间:2011-06-14 00:23:40

标签: 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查询,看看它在做什么。看起来它正在排序第一个表,然后是第二个表,然后比较它们。好吧,这让我觉得,如果我索引表格,他们将被预分类,差异查询会更快。

为每张桌子编制索引需要45分钟。一旦索引,每个Diff需要1:35小时。 为什么索引只能在总差异时间内减少5分钟?我会假设它会超过一半,因为在未编制索引的查询中,我每次对每个表进行排序两次(我需要运行两次查询)

由于其中一个表的变化不大,因此只需要将其编入索引一次,另一个将每天更新。因此,索引方法的总运行时间为45分钟,加上差异为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
);

4 个答案:

答案 0 :(得分:2)

在上面的陈述中,您没有使用索引。

您可以执行以下操作:

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中缺少的行

答案 1 :(得分:1)

确认您正在使用索引(它们可能不在这样的通用except语句中),但是您没有加入指定的列,因此缺少显式连接不会产生优化的查询: / p>

http://www.postgresql.org/docs/9.0/static/indexes-examine.html

这将有助于您更清楚地查看解释分析:

http://explain.depesz.com

此外,如果您希望立即执行索引,请确保在创建索引后对表进行分析:}

答案 2 :(得分:0)

指定的查询需要比较表的每一列。

例如,如果tableA和tableB各有5列,则查询必须将tableA.col1与tableB.col1,tableA.col2与tableB.col2进行比较。 。 。 tableA.col5到tableB.col5

如果只有少数列唯一标识记录而不是表中的所有columnS,那么加入唯一标识记录的特定列上的表将提高您的性能。

上述声明假定尚未创建主键。如果已定义主键以指示哪些列唯一标识记录,那么我相信EXCEPT语句会考虑这一点。

答案 3 :(得分:0)

  • 您申请了哪种指数?索引仅用于改善WHERE条件。如果你正在做一个select *,那么你抓住所有的字段并且索引可能没有做任何事情,但占用空间,并在后台添加更多处理以便db-engine进行比较查询索引缓存。

  • 您可以尝试选择唯一字段并为这些唯一字段创建索引,而不是SELECT *

  • 您还可以使用OUTER JOIN显示两个表中唯一字段不匹配的结果
  • 您可能需要考虑对表格进行聚类
  • 你在运行什么版本的Postgres?
  • 你最后一次吸尘是什么时候?

除了上述内容,13GB相当大,因此您需要检查配置设置。运行它不需要花费数小时,除非您的系统没有足够的内存。