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')
問題を打つことが可能になった= ad.ad_name'は、非検索引数可能 – SQLMenace
ナイスです!なきました私はlower()関数を削除しましたが、私はまだ同じ問題を抱えています。実際には、ロジックをビューに分割し、集計部分を削除しました。しかし、もう一度、そのビューを関数にラップすると、同じ問題が発生します。 – pyrospade
インラインとノンインラインの実行計画を投稿できますか? – EBarr