在我的选择中,我有一个由UDF产生的列。同一列也应该是where子句的一部分。除了两次调用UDF之外还有其他选择。我有大约15K行返回基于用户搜索,因此我想调用UDF,因为它正在减慢性能任何建议如何实现这一点。想要类似的东西。
SELECT EMP
, SAL
, Location
, dbo.GetCompValue
(EMP, SAL) AS CompValue
FROM tblEmpSal
WHERE CompValue > 5000;
答案 0 :(得分:1)
您可以使用CROSS/OUTER APPLY
:
SELECT EMP, SAL,Location, s.CompValue
From tblEmpSal
OUTER APPLY (SELECT dbo.GetCompValue(EMP,SAL) AS CompValue) s
WHERE s.CompValue > 5000
答案 1 :(得分:1)
UDF在性能方面总是很重要,您可以更改此函数逻辑以使其成为In-Line table valued function
,性能会更好,在某些情况下它也会使用缓存的执行计划。
SELELCT EMP, SAL,Location, CompValue
FROM (
SELECT EMP, SAL,Location, dbo.GetCompValue(EMP,SAL) AS CompValue
From tblEmpSal
)A
WHERE A.CompValue > 5000
答案 2 :(得分:0)
如果UDF的参数来自单个表,则一个选项(取决于该表的使用方式和UDF的性质)将向该表添加一个持久计算列,然后在SQL语句中使用该列而不是反复调用UDF。此列也可能被索引,但是否有任何好处将取决于您的查询正在做什么。