我有一个大表和一个带有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
还有其他方法可以改善它。
答案 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 BY
而SELECT
而不是{{1}}?我猜它不属于。