2012-07-10 171 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