2012-02-09 63 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