【发布时间】:2012-10-03 03:00:16
【问题描述】:
谁能告诉我以下哪一项更有效?我有数千万行要处理,性能至关重要。
在第二个示例中,table0 是一个临时表,它的创建似乎比第一个示例中的 table0 快得多。 (为什么?)在第一个示例中我不能使用临时表,因为在创建表之前无法声明变量行。 (table0 保存了原始表的所有不同行,下面的代码中没有显示。)
我想在第二个示例中为table1 中的blah2、blah3、blah4 和blah5 创建哈希索引是个好主意,尽管这样会花费更长的时间来写入桌子。
FOR row IN SELECT * FROM table0
LOOP
IF NOT EXISTS (SELECT 1 FROM table1
WHERE blah2 = row.blah2 AND blah3 = row.blah3
AND blah4 = row.blah4 AND blah5 = row.blah5) THEN
INSERT INTO table2
(blah0, blah1, blah2, blah3, blah4, blah5)
VALUES (row.blah0, row.blah1, row.blah2, row.blah3, row.blah4, row.blah5);
END IF;
END LOOP;
INSERT INTO table2
(blah0, blah1, blah2, blah3, blah4, blah5)
SELECT blah0, blah1, blah2, blah3, blah4, blah5 FROM table0
WHERE NOT EXISTS
(SELECT 1 FROM table1
WHERE table1.blah2 = table0.blah2
AND table1.blah3 = table0.blah3
AND table1.blah4 = table0.blah4
AND talbe1.blah5 = table0.blah5);
【问题讨论】:
-
很难准确说出您的要求。您似乎在谈论以不同方式创建的两个不同的
table0s(如何?为什么?)。另外,不要使用哈希索引,与 b-tree 相比几乎没有优势,而且它们维护得不好,不支持复制等。 -
如果比较性能使用
EXPLAIN ANALYZE。看看这两个,我预计第二个比第一个大大快,但你应该在缩小的样本上测量它,而不仅仅是猜测。 -
我觉得问题已经很清楚了。
标签: sql performance postgresql plpgsql temp-tables