哪个更好:NOT EXIST [data] vs ISNULL([data],'')= 0

时间:2016-08-15 12:47:08

标签: sql-server performance null

情况

为了找到特定列具有null值的行,我的一位同事通过使数据为空null来验证列中的数据是否为null

IF (SELECT * FROM [table] WHERE ISNULL([column], '')) = ''

但是我从Stack Overflow(example 1example 2)的多个示例中了解到,这种形式更为常见:

IF EXIST (SELECT [column] FROM [table])

通过尝试使我们的代码更高效,并尝试采用类似的编码行为/标准,我们遇到了这种审讯。

我希望第二种方式更高效,因为它不会调用函数,但我远不是SQL的专家。

问题:

  • 哪一个更高效?
  • 哪一个更好的做法?

2 个答案:

答案 0 :(得分:2)

  • 哪一个更高效? - 通过分析来衡量它。

  • 哪一种更好的做法? - 这取决于。

IF (SELECT * FROM [table] WHERE ISNULL([column], '')) = ''将缺少的数据与空字符串完全相同,而IF EXIST (SELECT [column] FROM [table])将它们视为不同。

所以这取决于data是否可以合法地成为空字符串。如果它不能,那么前者就可以了,如果可以的话,那就是后者。

答案 1 :(得分:2)

  

在尝试查找特定列具有null值的行时,如果{{1} null,我的同事会通过将数据设为空来验证列中的数据是否为null }:

     

...WHERE ISNULL([column], '') = ''

无论可以找到任何其他效率,使用ISNULL()似乎有点愚蠢,而这种情况很容易被表达为:

WHERE [column] IS NULL

现在,如果您需要测试以查看“至少1”行是否符合特定条件,那么使用EXISTS几乎总是(甚至可能总是)比不使用{更有效{1}}因为EXISTS运算符设计为在找到第一行时退出。如果没有返回任何行,那么两个方法可能都是等价的,但如果至少存在一行,那么EXISTS肯定会更好,因为它不会处理任何其他结果行,因为答案已经在逻辑上确定为EXISTS。当有许多行满足过滤条件时,效率会更明显。

因此,进行此特定测试的最有效方法是:

true

所以是的,尝试始终使用IF (EXISTS(SELECT * FROM [Table] WHERE [Column] IS NULL)) BEGIN ... END; (尽可能)。请阅读EXISTS运营商的MSDN页面,因为它有关于在EXISTS条款中使用它的其他信息。

有关如何测试效率的信息,请参阅您在DBA.StackExchange上发布的相关问题:

Performance and profiling on SELECT * FROM [table] ISNULL([column], '') = '' VS EXIST (SELECT * FROM [table] WHERE [condition])