2011-07-02 100 views
1

我有一個SELECT語句有三個內部聯接涉及兩個表。 除了在ON和WHERE子句中引用的列上創建索引之外,還有其他的事情可以優化連接,就像在重寫查詢中一樣?涉及三個表的內部聯接

SELECT 
    ... 
FROM 
    my_table AS t1 
INNER JOIN 
    my_table AS t2 
ON 
    t2.id = t1.id 
INNER JOIN 
    other_table AS t3 
ON 
    t2.id = t3.id 
WHERE 
... 

回答

0

您可能有一個錯誤在你的榜樣,因爲你選擇從my_table相同的記錄兩次,你可能真的只是做:

SELECT 
    ... 
FROM 
    my_table AS t1 
INNER JOIN 
    other_table AS t3 
ON 
    t1.id = t3.id 
WHERE 
... 

因爲在你的示例代碼T1總是會T2。

但讓我們假設你的意思是ON t2.idX = t1.id;那麼爲了回答你的問題,你不能獲得比你有更好的表現,你可以爲它們編制索引,或者你可以進一步將它們定義爲外鍵關係(與性能優勢相比,非索引與索引它們)。

您可能反而想要限制您的where子句,也許這就是您的索引將會(如果不是更多)的好處。

您可以使用WHERE EXISTS(如果您不需要從所有三個表中選擇數據)而不是INNER JOINS編寫查詢,但性能幾乎相同(除非它本身位於嵌套查詢中)因爲它仍然需要查找記錄。

1

您可以調整PostgreSQL配置,VACUUM ANALIZE和所有常規優化。

如果這還不夠,你可以花幾天時間編寫代碼來創建物化視圖,如postgresql wiki中所述。

0

在PostgreSQL中。大部分的調整不會在實際的查詢中。目標是幫助優化器找出如何最好地執行聲明性查詢,而不是指定如何從程序中執行。這並不是說有時查詢不能自己進行優化,或者他們可能不需要,但是這沒有任何我知道的問題區域,除非您正在檢索更多的記錄比你需要的(我偶爾看到過的)。

要做的第一件事是運行真空分析,以確保您有最佳的統計數據。然後使用解釋分析將預期的查詢性能與實際進行比較。從這一點來看,我們會查看索引等。此查詢中沒有任何內容需要在查詢級別進行優化。然而,如果沒有在where子句和解釋分析的實際輸出中查看實際的過濾器,則沒有太多可以建議的內容。

通常你會調整數據庫以選擇更好的查詢計劃,而不是在查詢中指定它。這通常是PostgreSQL的方式。評論當然有資格注意到有例外。