2012-02-09 54 views
0

如果這兩條語句在性能方面是等價的,我想知道:大量使用ISNULL的對嵌套SELECT

聲明1:

SELECT 
    ISNULL(T2.COL4, T1.COL4) 
FROM 
    T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1 
    JOIN T3 ON T2.COL1 IS NULL AND T3.COL2 = T1.COL2 OR T3.COL2 = T2.COL2 
WHERE 
    T3.COL3 = @COL3 

聲明2:

SELECT 
    T1.COL4 
FROM 
    (SELECT 
     ISNULL (T2.COL4, T1.COL4) COL4, 
     ISNULL (T2.COL2, T1.COL2) COL2 
    FROM T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1) T1 
    JOIN T3 ON T1.COL2 = T3.COL2 
WHERE 
    T3.COL3 = @COL3 

兩個語句是函數等價的(不是嗎?),但常識會提示第二個語句比較慢,因爲我們在應用WHERE子句之前「枚舉」T1 LEFT JOIN T2。但是它真的很慢,還是SQL Server有辦法優化它們並使它們等同?

的事情是寫它可以變得很討厭當你有幾個列從左連接使用,而第二種方式約束醜陋只嵌套SELECT的第一種方式。

+0

在這兩個語句中,'ISNULL(T2.COL1,T1.COL1) '可以簡寫爲:'T1.COL1' – 2012-02-09 07:02:40

+0

這是正確的!當我寫它時,我簡化了它。我編輯了我的問題,並更改了ISNULL語句中的列。 – 2012-02-09 07:20:13

+0

您也可以將它重寫爲兩個類似(但條件更簡單)查詢的'UNION'。 – 2012-02-09 07:22:23

回答

1

另一種方式來編寫查詢將兩個子查詢的用更簡單的加入條件的UNION並沒有用ISNULL()功能:

SELECT 
    T2.COL4 
FROM 
    T1 
    JOIN T2 ON T1.COL1 = T2.COL1 
    JOIN T3 ON T3.COL2 = T2.COL2 
WHERE 
    T3.COL3 = @COL3 

UNION ALL 

SELECT 
    T1.COL4 
FROM 
    T1 
    LEFT JOIN T2 ON T1.COL1 = T2.COL1 
    JOIN T3 ON T3.COL2 = T1.COL2 
WHERE 
    T2.COL1 IS NULL 
    AND 
    T3.COL3 = @COL3