Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 布尔等价_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 布尔等价

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

我经常在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_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通常会带来自身的性能问题!我将检查替代执行计划