2017-02-02 15 views
2

SQL Serverでクエリに問題があります。 where句で使用されるSQL Serverクエリのパフォーマンスビュー

は、私は常に構築されたビューの実行計画で見たwhere句
SELECT ... 
FROM T1 
WHERE 
(@param = 1 AND EXISTS (SELECT 1 FROM VIEW...)) // in this case => use view 
OR 
(@param = 2 AND T1.Id = ...) // in this case => no view 

のようにビューを使用していました。しかし私はそれを望んでいません。

+0

このビューのビューを参照する場合、このビューは常にビルドされています(dinamically generate)。クエリを部分的に実行することはできません。 – scaisEdge

答えて

1

あなたはどこドンあなたのビューがケースに構築したくない場合必要なときに動的SQLを使用し、ビュー・パーツを条件付きで使用可能または使用不可にする必要があります。そのような何か:

declare @useView nvarchar(max) = '--' 

if (@param = 1) 
set @useView = '' 

declare @sql nvarchar(max) = ' 
SELECT ... 
FROM T1 
WHERE 1=1 ' 
+ @useView ' AND EXISTS (SELECT 1 FROM VIEW...)) -- in this case => use view ' 
+' 
AND 
(@p_param = 2 AND T1.Id = ...) -- in this case => no view ' 

print @sql 
exec sp_executesql @sql,N'@p_param INT',@p_param = @param 

あなたは確かVIEWを参照し、全体SELECTがでカバーすることが1行に収まるようにする必要があり - コメント、そうでない場合は/**/のための2つのコメント変数を使用します。

+0

これはまさに私が望むものです。 –

+0

私は試してみます...それはReporting Servicesレポートのクエリです。そして、私は動的SQLがSSRSで動作することを願っています。 –

+0

@ L.Toto試してみてください。しかし、まず、SSMSで動作するクエリを作成し、手動で実行するときにエラーなしで実行されることを確認します。 – andrews

0

サブクエリおよびクエリオプティマイザへのパラメータ値のチェックはその後、より良い計画を構築することができるはずです移動:

SELECT ... 
FROM T1 
WHERE 
(EXISTS (SELECT 1 FROM VIEW ... WHERE ... @param = 1)) // in this case => use view 
OR 
(@param = 2 AND T1.Id = ...) // in this case => no view 
関連する問題