10

昨天我们遇到了一个场景,必须获取 a 的类型,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. 我在互联网上搜索以找到在效率方面更好的答案,但不幸的是我没有找到任何可以被认为是满意的答案。请用您的想法启发我,哪种方法更好?

4

3 回答 3

11
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 的逐行处理。

于 2012-11-08T07:25:35.747 回答
1

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

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

所以理论认为,相同的查询针对大型数据集双向运行,那么函数应该更慢。但是,在对数据进行操作时,差异可能微不足道,因此您应该尝试两种方法并测试它们,以确定任何性能折衷是否值得增加函数的效用。

于 2012-11-08T07:33:08.390 回答
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
于 2012-11-08T07:19:50.137 回答