使用CASE的效率当... ISNULL / COALESCE不是空的

时间:2011-07-20 15:57:12

标签: sql-server

考虑以下情况:

  • 有三种实体,例如FooBarBaz
  • 每个Foo必须与BarBaz相关联,但不能同时与两者同时关联。

该方案已按以下方式实施:

  • 有三个表:FooBarBaz
  • Foo有两个外键字段:Bar_IDBaz_ID
  • 其中一个外键字段必须是NULL

现在,我想构建一个显示Foo列表的查询,包括与BarBaz相关联的FooBar的说明。实际上,Bar的描述是Baz表中相应行的字段的非常复杂的公式。这同样适用于SELECT Foo.*, CASE WHEN Foo.Bar_ID IS NOT NULL THEN -- a formula, say... ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber WHEN Foo.Baz_ID IS NOT NULL THEN -- another formula, say... ISNULL(Baz.Color + ' ', '') + Baz.Type END AS 'Ba?Description' FROM Foo LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID

我当前的查询如下所示:

SELECT    Foo.*,
          ISNULL( -- or COALESCE
            ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber,
            ISNULL(Baz.Color     + ' ', '') + Baz.Type
          ) AS 'Ba?Description'
FROM      Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID

前面的查询是否比...更多,更少或同等效率

{{1}}

...

3 个答案:

答案 0 :(得分:5)

理论上,CASE应该是因为只评估了一个表达式。几个链式ISNULL都需要处理。

但是,您需要有一个大的(10000行)数据集才能发现任何差异:大多数处理都会进入实际的表访问,JOIN等。

你试过吗?您可以使用SQL事件探查器查看每个查询的CPU等。

答案 1 :(得分:1)

我相信ISNULL效率更高。 CASE语句总是先评估,我相信会限制查询优化器可用的选项。

执行计划说了什么?这是你的实际问题吗?

答案 2 :(得分:1)

COALESCEANSI函数,而ISNULLSQL Server专有函数。

它们在类型处理和其他一些方面有所不同,而COALESCE可能会接受两个以上的参数。

对于你的任务(两个参数,VARCHAR},它们是等价的。