2015-10-14 82 views
2

只想問問哪些需要更多時間。查詢時間執行

舉例如下場景:

SELECT * 
FROM 
    (SELECT * 
    FROM t1 
    WHERE [Date] BETWEEN "20151012" AND "20151018" 

    UNION ALL 

    SELECT * 
    FROM t2 
    WHERE [Date] BETWEEN "20151012" AND "20151018" 

    UNION ALL 

    SELECT * 
    FROM t3 
    WHERE [Date] BETWEEN "20151012" AND "20151018" 
) AS T 

或本聲明:

SELECT * 
FROM 
    (SELECT * FROM t1 

    UNION ALL 

    SELECT * FROM t2 

    UNION ALL 

    SELECT * FROM t3) AS T 
WHERE 
    [Date] BETWEEN "20151012" AND "20151018" 

非常感謝!

+3

大機會他們會表現相同...你不能檢查? –

+1

使用EXPLAIN來檢查執行計劃或實際運行查詢。 –

+0

第一個查詢不需要外部'SELECT * FROM',它只是多餘的。就查詢執行時間而言,它取決於不同的因素(表格的大小,每個表上的索引等)。試試拉馬先生的建議,看看執行計劃的樣子。 –

回答

0

我認爲最安全,最明確的版本是:

SELECT * 
FROM t1 
WHERE [Date] BETWEEN "20151012" AND "20151018" 

UNION ALL 

SELECT * 
FROM t2 
WHERE [Date] BETWEEN "20151012" AND "20151018" 

UNION ALL 

SELECT * 
FROM t3 
WHERE [Date] BETWEEN "20151012" AND "20151018" 

沒有必要希望查詢計劃是要找出哪些指標可以在子查詢中使用。你可能會得到同樣的表現,但是你不會因此而變得更糟。

0

SQL Server在將謂詞向下推送到基表時不會有任何問題。

您可以檢查執行計劃來驗證這一點。

我會更關心字符串文字的雙引號。您應該使用單引號,以便查詢在默認quoted_identifier設置下正常工作,並且不會將20151012解釋爲嘗試的列引用。