在sql中调用函数创建性能问题

时间:2016-03-23 12:02:12

标签: sql sql-server function

我有一个大表和一个带有select语句中的函数的sql语句,它确实返回日期值,但它影响性能,下面是代码

select dbo.fnname(ID)
       , ID
       , MIN_DATE
       , MAX_DATE
       , count(*) 
from schema (nolock)
group by dbo.fnname(ID), ID, MIN_DATE, MAX_DATE, PROGRAM_NAME
order by dbo.fnname(ID) desc

还有其他方法可以改善它。

2 个答案:

答案 0 :(得分:1)

虽然技术上不完全相同,但如果函数的结果是确定性的(例如相同输入的结果相同),则以下情况应该可以正常工作,我希望通过阅读查询。

select * 
from (
    select dbo.fnname(ID) idname, *
    from (
        select ID, MIN_DATE, MAX_DATE, count(*) cnt
        from schema (nolock)
        group by ID, MIN_DATE, MAX_DATE
    )
)
order by idname desc;

此处每个分组行只会对该函数进行一次扩展。

答案 1 :(得分:0)

您可以尝试使用CTE(或子查询):

with t as (
      select dbo.fnname(ID) as fnname_ID, t.*
      from schema
     )
select fnname_id, ID, MIN_DATE, MAX_DATE, count(*) 
from t
group by fnname_id, ID, MIN_DATE, MAX_DATE, PROGRAM_NAME
order by fnname_id desc;

这样可以将每行调用一次的次数减少一次。

另外,为什么PROGRAM_NAME中有GROUP BYSELECT而不是{{1}}?我猜它不属于。