私は SQL Server 2000 を使用していますが、インデックス付きビューの使用を開始するのをためらっています (毎日のパフォーマンス値を含むテーブルがあり、多くの数学関数でそれらをスコアリングする必要があります)。
(パフォーマンス テーブルを使用して) インデックス付きビューを作成し、パフォーマンス テーブルに新しい行を追加した場合、ビューのインデックスはすぐに更新されますか?それともビューの最初のユーザー要求で更新されますか?
私は SQL Server 2000 を使用していますが、インデックス付きビューの使用を開始するのをためらっています (毎日のパフォーマンス値を含むテーブルがあり、多くの数学関数でそれらをスコアリングする必要があります)。
(パフォーマンス テーブルを使用して) インデックス付きビューを作成し、パフォーマンス テーブルに新しい行を追加した場合、ビューのインデックスはすぐに更新されますか?それともビューの最初のユーザー要求で更新されますか?
インデックス付きビューは、基になるベース テーブルに影響を与えるクエリの一部として自動的に維持されます。
これが、インデックス付きビューに含めることができるものに非常に多くの制限がある理由です。制限が存在するのは、(潜在的に) 再スキャンする必要がなく、ベース テーブルで影響を受ける行に基づいてビューを更新できるようにするためです。ビューに含まれる行を決定するために、テーブル全体を調べます。
INSERT
これは、次のクエリのクエリ プランを調べることでも確認できます。
create table dbo.T (ID int not null)
go
create view dbo.V
with schemabinding
as
select ID from dbo.T
go
create unique clustered index I on dbo.V(ID)
go
insert into T(ID) values (1)
計画insert into T(ID) values (1)
は次のとおりです。
ご覧のとおり、プランにはI
viewのインデックスへの挿入が含まれていますV
。
上記は 2000 よりも新しいバージョンの SQL Server で行われました (サポートされていないバージョンが潜んでいるわけではありません) が、これらは常に機能していました。2000 年版のドキュメントでも、この制限について言及されています。
クラスター化インデックスの作成後、ビューのベース データを変更しようとする接続には、インデックスの作成に必要な同じオプション設定も必要です。ステートメントを実行する接続に適切なオプション設定がない場合、SQL Server はエラーを生成し、ビューの結果セットに影響を与える
INSERT
、UPDATE
、またはステートメントをロールバックします。DELETE
ビューがアクセスされたときにのみ更新された場合、この制限が存在する必要はありません。