我在PostgreSQL数据库上运行一个针对大表(7,000,000个新行/天)的sql查询集合,并且在第一个视图和现在创建表时遇到了一些性能问题。我使用的大多数命令与以下查询类似:
CREATE TABLE events_tb AS
SELECT *
FROM
(SELECT column1, column2, column3, column4, column5
FROM test_database_1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
) a
INNER JOIN ( SELECT DISTINCT column1 FROM test_database_2) b
ON (a.column1 = b.column1);
有没有办法改进上面的语句集合,以解决查询是针对非常大的表运行的事实?
答案 0 :(得分:5)
这应该更简单,更快捷:
CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM test_database_1 t1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
AND EXISTS (
SELECT 1
FROM test_database_2 t2
WHERE t2.column1 = t1.column1
);
您拥有它的方式将在新创建的表中包含column1
两次,这将导致错误消息。
EXISTS
semi-join应该比JOIN
或IN
表达式更快,因为它可以在第一次查找时停止执行。这对于重复项尤其有用 - 您可以从查询中的DISTINCT
判断出来。
答案 1 :(得分:2)
我对PostgreSQL的优化器一无所知,但您可以尝试用INNER JOIN
结构替换IN (SELECT...)
:
CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM test_database_1
WHERE column6 = 'value1'
AND date_column > '2012-07-01'
AND date_column < '2012-07-10'
AND column1 IN ( SELECT DISTINCT column1 FROM test_database_2 )