2014-12-02 82 views
-1

我期待我的優化SQL查詢,並想知道,在優化性能方面,如果加入子查詢結果性能

SELECT A.this, B.another FROM A 
JOIN B 
ON A.this = B.that 
WHERE B.another > 6 
AND A.something < 3; 

優於:

SELECT A.this, B.another 
FROM (SELECT this FROM A WHERE A.something < 3) AS A 
JOIN (SELECT another FROM B WHERE B.another > 6) AS B 
ON A.this = B.that; 
+0

Postgres有一個非常聰明的優化器,所以我不認爲它實現了子查詢。換句話說,這兩個版本應該有類似的表現。但是,你應該看看查詢計劃。 – 2014-12-02 13:28:08

+0

我認爲這種優化最好留給數據庫,並且使用第一個查詢的標準語法給予優化器最大的範圍,但我不是DBA。我會很樂意聽到關於這方面的更多消息。 – Resource 2014-12-02 13:28:34

+0

當你嘗試這兩種方法時,結果如何?這是唯一真正知道的方法。 – Flimzy 2014-12-02 13:35:57

回答

2

這兩個查詢運行時相同。嘗試運行以explain analyze開頭的兩個查詢,並且應該得到完全相同的查詢計劃。

簡而言之,Postgres將解析查詢並提出一個查詢樹。

它會重新寫查詢樹在適當的時候,以去除多餘的東西,如一個1 = 1 where子句,更換小IN()條款或等值使用ANY,或者,你的情況,你的崩潰兩個子查詢到父查詢。它會這樣做的原因是,它基本上將它們視爲select (select ...),而內部選擇不受聚合,組合或限制子句的限制。

只有這樣,它纔會花費一些時間分析查詢樹本身,以搜索它認爲最佳的查詢計劃。最後執行查詢計劃以返回您要求的行。

對於你要檢查出性能提示Postgres的手冊中的血淋淋的細節,還有explainexplain analyze語法:

還要注意Postgres的性能郵件列表,它的檔案,你會發現這裏:

學習他們是非常值得的,在這個意義上,這樣做會給你對引擎蓋下發生的事情有很多見解。特別關注Tom Lane編寫的消息 - 他偶爾會對查詢重寫器和規劃器中發生的事情進行第一手的說明。