Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化大型表上的SQL连接_Sql_Performance_Postgresql_Join_Bigdata - Fatal编程技术网

优化大型表上的SQL连接

优化大型表上的SQL连接,sql,performance,postgresql,join,bigdata,Sql,Performance,Postgresql,Join,Bigdata,我正在PostgreSQL数据库上对一个大表运行一组sql查询,每天新增7000000行,在第一次查看时遇到了一些性能问题,现在正在创建表。我使用的大多数命令类似于以下查询: CREATE TABLE events_tb AS SELECT * FROM (SELECT column1, column2, column3, column4, column5 FROM test_database_1 WHERE column6 = 'value1' AND date_column &

我正在PostgreSQL数据库上对一个大表运行一组sql查询,每天新增7000000行,在第一次查看时遇到了一些性能问题,现在正在创建表。我使用的大多数命令类似于以下查询:

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);

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

我对PostgreSQL的优化器一无所知,但您可以尝试用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 )

我对PostgreSQL的优化器一无所知,但您可以尝试用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 )

这应该更简单、更快:

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,这将导致一条错误消息


应该比联接或IN表达式快,因为它可以在第一次查找时停止执行。这对于重复项尤其有益——从查询中的不同点来看,您似乎拥有重复项。

这应该更简单、更快:

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,这将导致一条错误消息


应该比联接或IN表达式快,因为它可以在第一次查找时停止执行。这对于副本尤其有益——从您的查询中的差异来看,您似乎有副本。

请向我们展示执行计划。上传给您的解释分析更倾向于提到一组语句,但我只看到一个查询?请向我们展示执行计划。上传给您的解释分析更倾向于提到一组语句,但我只看到一个查询?因为您将其移动到了一个不同的位置,所以不再需要。这可能会改善或恶化性能,具体取决于数据是什么样的。date_列和column6是否有索引?在选择中。。。通常不会比PostgreSQL中的联接快。因为您已将其移动到distinct中的,所以不再需要。这可能会改善或恶化性能,具体取决于数据是什么样的。date_列和column6是否有索引?在选择中。。。通常不比PostgreSQL中的联接快。