非マテリアライズド ビューは、あらかじめパッケージ化された SQL クエリです。派生テーブル/インライン ビューと同じように実行されます。同じビューへの複数の参照は、参照ごとにビューに含まれるクエリを実行します。いいえ:
CREATE VIEW vw_example AS
SELECT id, column, date_column FROM ITEMS
SELECT x.*, y.*
FROM vw_example x
JOIN vw_example y ON y.id = x.id
...次のように変換されます。
SELECT x.*, y.*
FROM (SELECT id, column, date_column FROM ITEMS) x
JOIN (SELECT id, column, date_column FROM ITEMS) y ON y.id = x.id
キャッシング
クエリが同一になるため、主な利点はキャッシュです。実行計画が既に生成されているため、後でクエリをより高速に実行できるようにするために、実行計画を含むクエリがキャッシュされます。キャッシングでは、多くの場合、大文字と小文字を区別するポイントまでクエリを同一にする必要があり、最終的に期限切れになります。
述語のプッシュ
もう 1 つの潜在的な利点は、多くの場合、ビューで「述語のプッシュ」が許可されることです。この場合、ビューで指定された基準を、オプティマイザーによってビューが表すクエリにプッシュできます。これは、結果セットを外部/最終クエリに提示するためにテーブルをスキャンするのではなく、クエリがテーブルを 1 回スキャンできることを意味します。
SELECT x.*
FROM vw_example x
WHERE x.column = 'y'
...オプティマイザは次のように解釈できます。
SELECT id, column, date_column
FROM ITEMS
WHERE x.column = 'y'
述語プッシュの決定は、オプティマイザのみが行います。ビューが使用するクエリと、適用される追加の基準に実際に依存しているだけで、開発者が決定を強制する能力については知りません。
非マテリアライズド ビューの一般的な使用に関する解説
悲しいことに、マテリアライズされていない SQL ビューが、クエリの記述を簡素化するためのカプセル化にすぎないことがよくあります。簡素化も推奨される方法ではありません。SQL は SET ベースであり、手続き型のアプローチを使用して適切に最適化することはできません。ビューを互いに重ねることも、推奨される方法ではありません。
更新可能なビュー
マテリアライズされていないビューも更新可能ですが、多数のテーブルを結合してビューを作成できるため、制限があります。更新可能な非マテリアライズド ビューでは、ユーザーは新しいレコードを挿入できなくなりますが、既存のレコードを更新することはできます。 ある程度のCHECK OPTION
更新制限を適用するためにビューを作成するために使用されるクエリに依存しますが、何も起こらないことを保証するには十分ではありません。これは、不要な追加/編集/削除から保護するための唯一の信頼できる手段は、できればロールを介してユーザーに適切な権限を付与することであることを示しています。