1

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

有没有办法改进上述语句集合,以解决查询是针对非常大的表运行的事实?

4

2 回答 2

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半连接应该比JOINorIN表达式更快,因为它可以在第一次查找时停止执行。DISTINCT这对于重复项特别有用 - 从您的查询中判断,您似乎拥有重复项。

于 2012-07-10T23:19:21.763 回答
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 )
于 2012-07-10T21:57:16.260 回答