2016-03-31 50 views
0

我有許多表格,大約四個,我希望加入到一起。爲了使我的代碼更加清晰易讀(對我),我希望加入一下子,然後在年底進行過濾:加入多個表格:在哪裏進行有效過濾

SELECT f1, f2, ..., fn 
FROM t1 INNER JOIN t2 ON t1.field = t2.field 
     INNER JOIN t3 ON t2.field = t3.field 
     INNER JOIN t4 ON t3.field = t4.field 
WHERE // filters here 

但我懷疑,將在子查詢中每個表和篩選在每個範圍將使性能更好。

SELECT f1, f2, ..., fn 
FROM (SELECT t1_f1, t1_f2, ..., t1_fi FROM t1 WHERE // filter here) AS a 
    INNER JOIN 
    (SELECT t2_f1, t2_f2, ..., t2_fj FROM t2 WHERE // filter here) AS b 
    ON // and so on 

請提醒哪些會導致更好的性能和/或如果我的預感是正確的。我願意爲了可讀性而犧牲性能。

如果每個子查詢確實濾波將更加有效率,它的數據庫平臺的架構將使任何區別,或者這是對所有RDBMS SQL口味也是如此?

我使用的是SQL Server和Postgres的。

+6

編寫可讀代碼,優化器應該處理過濾順序。 – jarlh

+2

你也可以直接使用過濾條件進入連接條件:'FROM t1 JOIN t2 ON t1.field = t2.field AND t2.column3> 42'。但是,所有三種選擇最有可能產生相同的執行計劃。但驗證這一點的唯一方法是查看執行計劃(在兩個產品中) –

+0

對於PosgresSQL或MySQL使用EXPLAIN來獲取有關如何執行查詢的更多信息。 SQL Server具有顯示執行計劃的圖形工具。要從執行計劃輸出中優化SQL start –

回答

2

查詢優化器將一直試圖照顧從SQL中找到最優化的計劃。

你應該更專注於寫可讀,可維護的代碼,然後通過分析執行計劃找到你的查詢(和可能性更大)數據庫和索引設計的低效率部分的低效部分。

四處移動你的過濾從where子句中加入條款,沒有任何有意義的分析,很可能是無用功。

0

加入總會有更好的表現,如果你有正確的索引。

+0

這並沒有真正回答這個問題。 – MikeTheLiar

1

你的第一個方法將總是爲SQL引擎將評估那裏的條件,然後再執行連接好。因此,在評估where子句時,如果條件可用,它將過濾記錄。

SELECT f1, f2, ..., fn 
FROM t1 INNER JOIN t2 ON t1.field = t2.field 
    INNER JOIN t3 ON t2.field = t3.field 
    INNER JOIN t4 ON t3.field = t4.field 
WHERE // filters here 
+1

這根本不是真的(至少不像你聲稱的那樣「一般」)。如果兩種選擇導致相同的執行計劃,我都不會感到驚訝。 –