Кажется, я не могу понять, почему SQL Server использует совершенно другой план выполнения при заключении моего кода в ITVF. При самостоятельном запуске кода внутри 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')
Есть идеи?