Sql server 布尔等价
我经常在ON子句中使用ISNULL和COALESCE,但我已经了解到这可能会导致优化问题,因为索引可能不会被使用 我目前有以下情况:Sql server 布尔等价,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我经常在ON子句中使用ISNULL和COALESCE,但我已经了解到这可能会导致优化问题,因为索引可能不会被使用 我目前有以下情况: 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
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%认为它可能会影响性能,但最近我阅读了伊兹克·本·甘的一篇文章,其中指出在连接数据集时使用诸如coalesct1.col1,-1=coalesct2.col1,-1这样的谓词可能会影响性能,因为对col1的操作将意味着数据被重新构建,col1上的现有索引将不会被使用。这就是撒娇的概念
而不是使用这个匹配谓词
聚结1.col1,-1=聚结2.col1,-1
他建议这样做
T1.col1=T2.col1或T1.col1为空,T2.col1为空不,它们不是
你所写的相当于
(x.Client = y.Client AND x.Prod = y.Prod)
OR (y.Client IS NULL)
OR (y.Prod IS NULL)
你需要
(x.Client = y.Client OR y.Client IS NULL)
AND
( x.Prod = y.Prod OR y.Prod IS NULL)
我不确定这会比原来的更好
在性能方面,在SQL Server上,ISNULL通常比COALESCE性能更好,但如果这对您很重要的话,后者符合ANSI标准
所以在我看来,你可能想做一个左连接
FROM dbo.tb_xxx x
LEFT JOIN dbo.tb_yyy y ON
x.Client = y.Client AND
x.Prod = y.Prod
不,他们不是
你所写的相当于
(x.Client = y.Client AND x.Prod = y.Prod)
OR (y.Client IS NULL)
OR (y.Prod IS NULL)
你需要
(x.Client = y.Client OR y.Client IS NULL)
AND
( x.Prod = y.Prod OR y.Prod IS NULL)
我不确定这会比原来的更好
在性能方面,在SQL Server上,ISNULL通常比COALESCE性能更好,但如果这对您很重要的话,后者符合ANSI标准
所以在我看来,你可能想做一个左连接
FROM dbo.tb_xxx x
LEFT JOIN dbo.tb_yyy y ON
x.Client = y.Client AND
x.Prod = y.Prod
+1它看起来确实像一个左连接,除了它不接受x.Client或x.Prod为null的行,这将在左连接中被接受。另外,一个值可以匹配,而另一个值不匹配…+1谢谢。COALESCE是我的默认设置,因为它似乎能更好地处理类型问题……我编辑了OP,对我最近读到的内容进行了更好的解释,这促使我在课堂上转换此内容。确定性能的最佳方法可能是在您自己的特定情况下对数据进行实验。例如,在过滤器中使用OR通常会带来自身的性能问题!我将检查备选执行计划+1,它看起来确实像左联接,除了它不接受x.Client或x.Prod为null的行,这将在左联接中被接受。另外,一个值可以匹配,而另一个值不匹配…+1谢谢。COALESCE是我的默认设置,因为它似乎能更好地处理类型问题……我编辑了OP,对我最近读到的内容进行了更好的解释,这促使我在课堂上转换此内容。确定性能的最佳方法可能是在您自己的特定情况下对数据进行实验。例如,在过滤器中使用OR通常会带来自身的性能问题!我将检查替代执行计划