【问题标题】:Performance: COALESCE resultset against NULL vs. @@ROWCOUNT性能:针对 NULL 与 @@ROWCOUNT 的 COALESCE 结果集
【发布时间】:2012-06-29 18:24:46
【问题描述】:

我目前正在编写一个存储过程,它为调用应用程序提供有效城市和州值的检索。
当提供 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 (''))

由于此事务每秒会运行很多次,我想让它尽可能高效。从性能的角度来看,哪个更有效?另外,如果还有其他更好的方法,请随时告诉我。谢谢!

【问题讨论】:

  • 您是否测试过您的第二种方法?我不认为这是有效的语法。
  • COALESCE 如何使用多列选择作为参数? sqlfiddle.com/#!6/d41d8/163
  • 你为什么不想在应用程序端处理这个? id 结果为 null 或数据集为空 return 'ZipCode Wrong!'
  • @TelJanini 那也行不通。它有一个多列选择和一个单列选择。 COALESCE 需要一个标量参数...
  • 嗯,这似乎是 SQL Server。存储过程返回整数。我不知道他们返回字符串。

标签: sql performance select stored-procedures null


【解决方案1】:

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

真的的意思是问它是否存在......那么为什么不使用用于该目的的子句呢?

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

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

不过,请考虑您的用例。 您是否期望更多的错误和有效的回报?如果是这样,那么EXISTS 语法作为过滤器可能会更好......如果您期望更多的有效返回,那么带有@@ROWCOUNTSELECT 可能是首选。

对于这个,答案非常直接:这取决于

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

【讨论】:

  • 数据库是 SQL Server 2008 R2。感谢您的回答!
【解决方案2】:

我认为你应该在应用层处理这个问题。查看返回的行数并以这种方式检测错误。比 SQL 解决方案更快、更简单、更简洁。

【讨论】:

    【解决方案3】:

    如果然后分支通常需要更多时间,COALESCE 更容易让您的处理器优化。

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

    【讨论】:

      【解决方案4】:

      当你不需要的时候不要创建一个完整的结果,只是做一个计数:

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

      【讨论】:

      • 计数通常不需要每次都对表进行全面扫描...如果只需要确认存在拉链在桌子上。
      • 何必计算结果呢?
      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2011-05-11
      • 2021-10-10
      • 2017-03-30
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多