我正在研究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
);
答案 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
这将有助于您更清楚地查看解释分析:
此外,如果您希望立即执行索引,请确保在创建索引后对表进行分析:}
答案 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
显示两个表中唯一字段不匹配的结果除了上述内容,13GB相当大,因此您需要检查配置设置。运行它不需要花费数小时,除非您的系统没有足够的内存。