2012-07-10 107 views
1

我正在PostgreSQL数据库上运行一个大型表(每天700万新行)的sql查询集合,并且已经遇到了第一个视图和现在创建表的一些性能问题。大多数我使用的命令类似于下面的查询:优化大型表上的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); 

是否有提高报表上述集合占的事实,查询正在对非常大的表运行的方法吗?

+1

请向我们展示执行计划。最好像'explain analyze'上传到http://explain.depesz.com/ – 2012-07-10 21:55:24

+1

您提到一个“语句集合”,但我只看到一个查询? – 2012-07-10 23:06:43

回答

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应该比JOININ表达更快,因为它可以在第一次发现停止执行。这对复制品尤其有益 - 从您的查询中的DISTINCT来看,您似乎拥有这些复制品。

2

我什么都不知道PostgreSQL的优化器,但你可以尝试用IN (SELECT...)结构替换INNER JOIN

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) 
+1

既然你把它移到了'IN','distinct'就不再需要了。这可能会改善或恶化perf,具体取决于数据是什么样的。 – 2012-07-10 22:00:30

+1

或者如果PG有一些大脑,它会简单地忽略它。 – biziclop 2012-07-10 22:03:05

+0

'date_column'和'column6'有索引吗? – 2012-07-10 22:57:29