6

ITVFでコードをラップするときに、SQL Serverが完全に異なる実行計画を採用している理由がわかりません。 ITVF内でコードを単独で実行すると、クエリは5秒後に実行されます。 ITVFとして保存すると、20分間実行され、結果は得られません。コード再利用のためにこれをITVFに入れたいと思っています。コードをITVFとして保存する理由は、パフォーマンス上の問題を引き起こすでしょうか?インラインテーブル値関数として保存すると、T-SQLコードが極端に遅くなる

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 
) 

EDIT:

[OK]を...私はこの問題を考え出したと思います...しかし、私はそれを理解していません。おそらく、全く新しい質問を投稿して、あなたの考えを教えてください。ここでの問題は、リテラルで関数を呼び出すときです。本当に遅いです...変数で呼び出すと高速です。

-- 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') 

+0

問題を打つことが可能になった= ad.ad_name'は、非検索引数可能 – SQLMenace

+0

ナイスです!なきました私はlower()関数を削除しましたが、私はまだ同じ問題を抱えています。実際には、ロジックをビューに分割し、集計部分を削除しました。しかし、もう一度、そのビューを関数にラップすると、同じ問題が発生します。 – pyrospade

+0

インラインとノンインラインの実行計画を投稿できますか? – EBarr

答えて

5

リテラルを使用すると、SQL Serverは列統計を参照して返される行の数を推定し、その前提に基づいて適切な計画を選択できます。変数を使用すると、値はコンパイル時には分かりませんので、値は推測に戻ってしまいます。

実際の統計を参照する場合よりも計画が優れている場合は、統計が更新する必要がある可能性が高いことを示します。あなたは、統計の自動更新をお持ちの場合は

)がusers.auth_login((下 `そしてあなたがよく初心者のためにここStatistics, row estimations and the ascending date column

+1

うわー、決して推測したことはありません。良い情報!私は評判を得るとすぐにアップ投票します! – pyrospade

関連する問題