我似乎无法找出为什么在ITVF包装我的代码SQL Server时采取了完全不同的执行计划。 当其自身的运行ITVF内部的代码,查询在5秒内运行。 如果我将其保存为ITVF,它将运行20分钟,并没有产生结果。 我更愿意有这样的代码重用的ITVF。 任何想法,为什么可以节省代码为ITVF会导致严重的性能问题?
CREATE FUNCTION myfunction
(
@start_date date,
@stop_date date
)
RETURNS TABLE
AS
RETURN
(
with
ad as (
select [START_DATE]
,[STOP_DATE]
,ID
,NAME
,'domain1\' + lower(DOMAIN1_NAME)
collate database_default as ad_name
from EMP_INFO
where DOMAIN1_NAME != ''
union
select [START_DATE]
,[STOP_DATE]
,ID
,NAME
,'domain2\' + lower(DOMAIN2_NAME)
collate database_default as ad_name
from EMP_INFO
where DOMAIN2_NAME != ''
)
select ad.ID
,ad.NAME
,COUNT(*) as MONITORS
from scores
join users
on (scores.evaluator_id = users.[user_id])
join ad
on (lower(users.auth_login) = ad.ad_name and
scores.[start_date] between ad.[START_DATE] and ad.[STOP_DATE])
where scores.[start_date] between @start_date and @stop_date
group by ad.ID
,ad.NAME
)
编辑:
好吧...我想我想通了这个问题...但我不明白。 也许我应该发布一个全新的问题,让我知道你在想什么。 这里的问题是,当我打电话与文字的功能,它实在是太慢了...当我用变量调用它速度快。
-- Executes in about 3 seconds
declare @start_date date = '2012-03-01';
declare @stop_date date = '2012-03-31';
select *
from myfunction(@start_date, @stop_date);
--Takes forever! Never completes execution...
select *
from myfunction('2012-03-01', '2012-03-31')
有任何想法吗?