使用UDF生成的列的位置

时间:2016-07-13 18:50:02

标签: sql-server tsql

在我的选择中,我有一个由UDF产生的列。同一列也应该是where子句的一部分。除了两次调用UDF之外还有其他选择。我有大约15K行返回基于用户搜索,因此我想调用UDF,因为它正在减慢性能任何建议如何实现这一点。想要类似的东西。

SELECT EMP
    , SAL
    , Location
    , dbo.GetCompValue
      (EMP, SAL) AS CompValue
FROM   tblEmpSal
WHERE  CompValue > 5000;

3 个答案:

答案 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。此列也可能被索引,但是否有任何好处将取决于您的查询正在做什么。