【问题标题】:Database Function VS Case Statement数据库函数 VS 案例语句
【发布时间】:2012-10-28 08:45:40
【问题描述】:

昨天我们遇到了一个必须获取db field 类型的场景,在此基础上我们必须编写该字段的描述。喜欢

Select ( Case DB_Type When 'I' Then 'Intermediate'
                      When 'P' Then 'Pending'
                      Else 'Basic'
         End)
From DB_table

我建议编写一个 db 函数而不是这个 case 语句,因为这样更可重用。喜欢

Select dbo.GetTypeName(DB_Type) 
from DB_table

有趣的是,我们的一位开发人员说使用数据库功能会低效,因为database functionsCase statement。我在互联网上搜索以找到在效率方面更好的答案,但不幸的是我没有找到任何可以被认为是满意的答案。请赐教您的想法,哪种方法更好?

【问题讨论】:

  • 这个dbo.GetTypeName(DB_Type) 有相同的CASE 表达式吗?即:您在询问将CASE 表达式直接写入查询与将其放入用户定义的函数在性能和可重用性方面 之间的区别。对吗?
  • 是的!一切都一样。

标签: sql sql-server tsql sql-function


【解决方案1】:

你的 devolper 是对的。函数会减慢您的查询速度。

https://sqlserverfast.com/?s=user+defined+ugly

Calling functionsis like:
wrap parts into paper
put it into a bag
carry it to the mechanics
let him unwrap, do something, wrapt then result
carry it back
use it

【讨论】:

  • 即使它有相同的CASE 表达式?
【解决方案2】:
UDF function is always slower than case statements

请参考文章

http://blogs.msdn.com/b/sqlserverfaq/archive/2009/10/06/performance-benefits-of-using-expression-over-user-defined-functions.aspx

以下文章建议您何时使用 UDF

http://www.sql-server-performance.com/2005/sql-server-udfs/

总结:

使用用户定义的函数时会付出很大的性能损失。当查询将 UDF 应用于大量行(通常为 1000 或更多)时,这种损失表现为查询执行时间过长。由于 SQL Server 数据库引擎必须创建自己的内部游标类处理,因此会产生惩罚。它必须在每一行上调用每个 UDF。如果在 WHERE 子句中使用 UDF,这可能会作为过滤行的一部分发生。如果在选择列表中使用了 UDF,则在创建查询结果以传递到查询处理的下一阶段时会发生这种情况。 最慢的是 SQL Server 的逐行处理。

【讨论】:

  • 所以预定义的函数也属于这种情况。如果是,那么让我们开始避免像 IsNull 这样的 sql 预定义函数。
【解决方案3】:

当使用标量函数(返回一个值的函数)时,函数的内容将每行执行一次,但 case 语句将在整个集合中执行。

通过对整个集合进行操作,您可以让服务器更有效地优化您的查询。

所以理论上说,相同的查询针对大型数据集以两种方式运行,那么函数应该更慢。但是,在对您的数据进行操作时,差异可能很小,因此您应该尝试这两种方法并对其进行测试,以确定任何性能折衷是否值得增加函数的效用。

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 2015-05-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多