0

CASESQL 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 はすべての行のステータスを計算してからフィルタリングしているようです。これははるかに非効率的です。LibraryBookCASE

CASE式が本当にブラック ボックスである場合、保守性とクエリの実行速度との間にトレードオフが生じます。

では、妥協せずにこのようなロジックをカプセル化することはできないのでしょうか? viewより効率的なクエリ プランの構築を可能にする定式化の方法はありますか?

4

2 に答える 2