优化大型表上的SQL连接

use*_*980 1 sql postgresql performance join bigdata

我的计算机运行的SQL查询的对一个大表PostgreSQL数据库上的集合(700万个新行/天),并已运行到与第一观点的一些性能问题,现在创建表.我使用的大多数命令与以下查询类似:

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);
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 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
    );
Run Code Online (Sandbox Code Playgroud)

您拥有它的方式将column1在新创建的表中包含两次,这将导致错误消息.

一个EXISTS半连接应该比更快JOININ表达,因为它可以在第一次发现停止执行.这对于重复项尤其有用 - 您可以从DISTINCT查询中判断出重复项.