性能:COALESCE结果集反对NULL与@@ ROWCOUNT

时间:2012-06-29 18:24:47

标签: sql performance select stored-procedures null

我正在编写一个存储过程,它为调用应用程序提供有效的城市和州值的检索 当提供zip_code时,存储过程将返回指定输入参数的所有有效城市/州组合的列表 但是,如果zip_code不存在,那么存储过程必须返回错误字符串'ZipCode Wrong!'返回调用应用程序而不是空数据集 我考虑了两种方法:

第一种方法

SELECT City, State FROM ZipCodeTable WHERE Zip = @ZipCode
IF (@@ROWCOUNT = 0)
return 'ZipCode Wrong!'

第二种方法

SELECT COALESCE(  
               (SELECT City, State FROM ZipCodeTable WHERE Zip=@ZipCode FOR XML PATH ('')),
               (SELECT 'ZipCode Wrong!') FOR XML PATH (''))

由于此事务每秒运行很多次,我希望尽可能高效。从绩效的角度来看哪一个更有效率?此外,如果有另一种更好的方法,请随时告诉我。谢谢!

4 个答案:

答案 0 :(得分:1)

也许您不使用COUNT而不使用SELECT因为一个计算您的结果而另一个返回一个集合。

真的意味着询问它是否存在......那么为什么不使用那个用于此目的的条款呢?

EXISTS
http://msdn.microsoft.com/en-us/library/ms188336.aspx

如果您希望返回结果(如果存在),并且错误消息(如果不存在),则@@ROWCOUNT可能更快......您应该使用分析器对其进行基准测试。

考虑你的用例。 您是否期望明显更多的错误和有效的回报?如果是这样,那么EXISTS语法可能更适合作为过滤器......如果您期望更多有效的回报,则可能首选SELECT @@ROWCOUNT

对于这个,答案非常正确:取决于

您使用的数据库是什么?也许对此有一种特定于实现的方法。

答案 1 :(得分:0)

IF然后分支通常需要更多时间,COALESCE更易于您的处理器进行优化。

那就是说,它们可能会以相同的速度运行,我会加速测试两种解决方案。

答案 2 :(得分:0)

当您不需要时,不要创建整个结果,只需进行计数:

declare @cnt int
select @cnt = count(*) from ZipCodeTable where Zip = @ZipCode
if (@cnt) begin
  return 'ZipCode Wrong!'
end

答案 3 :(得分:0)

我认为您应该在应用程序层中处理此问题。查看返回的行数并以这种方式检测错误。比SQL解决方案更快,更简单,更清晰。

相关问题