2017-05-26 50 views
0

呼籲所有SQL專家。我有以下select語句:SQL查詢性能與註冊條件

SELECT 1 
    FROM table1 t1 
    JOIN table2 t2 ON t1.id = t2.id 
WHERE t1.field = xyz 

我對這裏的表現有點擔心。在連接之前或之後評估where子句?如果評估之後,是否有方法首先評估where子句?

整個表可以很容易地包含超過一萬個條目,但在where子句後,可能只有1-10項留給所以在我看來,這確實是一個很大的性能差異取決於當where子句進行評估。

在此先感謝。

低糜

+1

如果'field'被索引有什麼可擔心的 –

+0

標籤您正在使用的數據庫管理系統。給我們表和索引定義。 – jarlh

+1

您可以在Join子句中添加t1.field,而不是在where子句中。 –

回答

1

對於此查詢:

SELECT 1 
FROM table1 t1 JOIN 
    table2 t2 
    ON t1.id = t2.id 
WHERE t1.field = xyz; 

的最佳指標是table1(field, id)table2(id)

如何執行查詢依賴於優化。在給定表格統計數據和環境的情況下,它負責選擇基於執行計劃。

2

你可以重寫查詢是這樣的:

SELECT 1 
    FROM (SELECT * FROM table1 WHERE field = xyz) t1 
    JOIN table2 t2 ON t1.id = t2.id 

但根據數據庫產品的優化器可能仍然決定,要做到這一點,最好的辦法就是加入到表1表2,然後應用約束。

1

每個DBMS都有自己的查詢優化器。所以通過事情的邏輯,在你的情況下WHERE將首先執行,然後JOIN查詢的一部分

+0

但是,例如,MSSQL首先創建一個臨時表與加入的結果,然後,執行WHERE子句。 –

+0

不確定你從哪裏得到這些信息? – Jovana

+0

使用MSSQL查詢分析器。 –

1

正如在評論和其他答案中所提到的性能,答案總是「取決於你的DBMS和索引基表的查詢可能沒有問題,優化器可能會先評估其中的位置。或者,如果索引覆蓋了加入需求,那麼聯接可能是有效的。

或者你可以強迫你所需要的行爲,通過降低你之前T1的數據集也使用嵌套選擇理查德建議或添加t1.field = XYZ的加入例如

ON t1.field = xyz AND t1.id = t2.id 

聯接個人如果我需要降低數據集的加入之前,我會用一個CTE

With T1 AS 
(
    SELECT * FROM table1 
    WHERE T1.Field = 'xyz' 
) 
SELECT 1 
FROM T1 
JOIN Table2 T2 
ON T1.Id = T2.Id