数据库函数VS案例陈述

时间:2012-11-08 07:12:45

标签: sql sql-server tsql sql-function

昨天我们得到了一个必须得到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 functions 而不是Case statement。我通过互联网搜索找到答案,这是效率方面更好的方法但不幸的是我发现没有什么可以被认为是满意的答案。请用你的想法启发我,哪种方法更好?

3 个答案:

答案 0 :(得分:9)

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的速度。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

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