Sql 大量使用ISNULL与嵌套SELECT
我想知道这两种说法在性能方面是否相同: 报表1:Sql 大量使用ISNULL与嵌套SELECT,sql,sql-server,tsql,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
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左连接T2。但它真的很慢吗?或者SQL Server有没有办法对它们进行优化并使它们等效
问题是,第一种编写方法在左连接中有多个列要使用时可能会变得非常糟糕,而第二种方法将丑陋限制在嵌套的SELECT上。另一种编写查询的方法是两个子查询的
并集,具有更简单的连接条件,并且不使用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
在这两条语句中,ISNULL(T2.COL1,T1.COL1)
可以简单地写为:T1.COL1
,这是正确的!我写的时候把它简化了。我编辑了我的问题并更改了ISNULL语句中的列。您也可以将其重写为两个类似(但条件更简单)查询的联合。