大量使用ISNULL与嵌套SELECT

时间:2012-02-09 06:51:35

标签: sql sql-server tsql

我想知道这两个陈述在性能方面是否相同:

声明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中。

1 个答案:

答案 0 :(得分:1)

编写查询的另一种方法是UNION两个子查询,其中包含更简单的Join条件且不使用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