次のようなクエリがあります。
select <field list>
from <table list>
where <join conditions>
and <condition list>
and PrimaryKey in (select PrimaryKey from <table list>
where <join list>
and <condition list>)
and PrimaryKey not in (select PrimaryKey from <table list>
where <join list>
and <condition list>)
副選択クエリには両方とも、ステートメントが乱雑にならないように、表示していない独自の複数の副選択クエリがあります。
私のチームの開発者の1人は、ビューの方が良いと考えています。 SQLステートメントが(ユーザーのログインIDに基づいて)プログラムから渡された変数を使用することに同意しません。
ビューをいつ使用するか、SQLステートメントを使用するかについての厳格なルールはありますか?通常のテーブルに対して、またはビューに対してSQLステートメントを単独で実行すると、どのようなパフォーマンス向上の問題が発生します。 (すべての結合/ where条件がインデックス付き列に反しているため、問題にならないことに注意してください。)
明確にするために編集...
これが私が扱っているクエリです:
select obj_id
from object
where obj_id in(
(select distinct(sec_id)
from security
where sec_type_id = 494
and (
(sec_usergroup_id = 3278
and sec_usergroup_type_id = 230)
or
(sec_usergroup_id in (select ug_gi_id
from user_group
where ug_ui_id = 3278)
and sec_usergroup_type_id = 231)
)
and sec_obj_id in (
select obj_id from object
where obj_ot_id in (select of_ot_id
from obj_form
left outer join obj_type
on ot_id = of_ot_id
where ot_app_id = 87
and of_id in (select sec_obj_id
from security
where sec_type_id = 493
and (
(sec_usergroup_id = 3278
and sec_usergroup_type_id = 230)
or
(sec_usergroup_id in (select ug_gi_id
from user_group
where ug_ui_id = 3278)
and sec_usergroup_type_id = 231)
)
)
and of_usage_type_id = 131
)
)
)
)
or
(obj_ot_id in (select of_ot_id
from obj_form
left outer join obj_type
on ot_id = of_ot_id
where ot_app_id = 87
and of_id in (select sec_obj_id
from security
where sec_type_id = 493
and (
(sec_usergroup_id = 3278
and sec_usergroup_type_id = 230)
or
(sec_usergroup_id in (select ug_gi_id
from user_group
where ug_ui_id = 3278)
and sec_usergroup_type_id = 231)
)
)
and of_usage_type_id = 131
)
and
obj_id not in (select sec_obj_id
from security
where sec_type_id = 494)
)
データベースベンダーによって異なりますが、一般に、ビューに対するクエリの実行では、ビューで定義されたSQLと、ビューに対して渡すSQLに追加されたWhere句の述語とOrderBy句の並べ替え式が組み合わされて作成されます。実行する完全なSQLクエリの組み合わせ。これは、それ自体がクエリ処理プログラムに渡されたかのように実行されるため、違いはありません。
ビューは組織的なツールであり、パフォーマンス向上ツールではありません。
From SQL Serverビューの解像度
SQLステートメントがインデックス付けされていないビューを参照する場合、パーサーとクエリオプティマイザーは、SQLステートメントとビューの両方のソースを分析し、それらを単一の実行プランに解決します。 SQLステートメント用の1つのプランと、ビュー用の個別のプランはありません。
通常の(非インデックス/マテリアライズド)ビューは単なるエイリアスです。パフォーマンス上の利点はありません。ビューから選択すると、テーブルから直接選択した場合とまったく同じクエリプランが生成されます。
ビューはさておき、PrimaryKey AND句は冗長ではありませんか? PrimaryKey値がリスト内にある場合、それは他のリスト内にありませんか?これらの2つの句を1つに凝縮すると、パフォーマンスが向上すると思います。