CASE
SQL Server クエリ オプティマイザが、実行計画を判断するときに式の内部を調べるほどスマートかどうかを知りたいです。
レポートの目的で、view
レコードを分類するためのロジックをカプセル化する を作成しました。データベース内の他の場所のルックアップ数に基づいて、「ステータス」列を追加します。簡単な例を次に示します。
create view LibraryBook_with_Status
as
select
LibraryBook.*,
case
when (some logic) then 'Deleted'
when (more logic) then 'Checked Out'
when (more logic) then 'Out for Repair'
when (more logic) then 'On Hold'
else 'On the Shelf'
end as [Status]
from
LibraryBook
left outer join
(bunch of other tables used in Status calculation, preserving cardinality)
これview
を他のクエリで使用し、SQL Server にCASE
ロジックを考慮した実行プランを作成させたいと考えています。例えば:
select *
from LibraryBook_with_Status
where [Status] = 'Deleted'
このクエリが ではなくベース テーブルのみを参照するように記述されている場合、式の最初の句でこれらのテーブルview
のみが使用されます。しかし、私の初歩的なテストに基づくと、SQL Server はすべての行のステータスを計算してからフィルタリングしているようです。これははるかに非効率的です。LibraryBook
CASE
CASE
式が本当にブラック ボックスである場合、保守性とクエリの実行速度との間にトレードオフが生じます。
では、妥協せずにこのようなロジックをカプセル化することはできないのでしょうか? view
より効率的なクエリ プランの構築を可能にする定式化の方法はありますか?