Код T-SQL очень медленный при сохранении в виде встроенной функции с табличным значением

Кажется, я не могу понять, почему 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')

Есть идеи?

7
задан Martin Smith 6 April 2012 в 21:46
поделиться