我经常使用ISNULL
and COALESCE
in子句,但读到这可能会导致优化问题,因为索引可能不会被使用。ON
我目前有以下内容:
FROM dbo.tb_xxx x
INNER JOIN dbo.tb_yyy y ON
x.Client = COALESCE(y.Client, x.Client) AND
x.Prod = COALESCE(y.Prod, x.Prod)
...我已转换为以下...
FROM dbo.tb_xxx x
INNER JOIN dbo.tb_yyy y ON
x.Client = y.Client AND
x.Prod = y.Prod
OR y.Client IS NULL
OR y.Prod IS NULL
这些是等价的吗?
如果不是,那为什么不呢?
编辑
我不是 100% 认为它可能会影响性能,但最近我读了 Itzik Ben-Gan 的一篇文章,其中指出使用谓词(如COALESCE(T1.col1,-1) = COALESCE(T2.col1,-1)
连接数据集时)会影响性能,因为对 col1 的操作将意味着数据重新col1 上的已建索引和现有索引将不会被使用。这就是“sargability”的概念。
而不是使用这个匹配谓词
COALESCE(T1.col1,-1) = COALESCE(T2.col1,-1)
他建议这个
T1.col1 = T2.col1 OR (T1.col1 IS NULL AND T2.col1 IS NULL)