SQL Serverで常にインデックス付きビューを作成して、既存の製品を調整しています。適切な列を利用している場合、オプティマイザは十分に賢く、インデックスを使用できます。
この例を使用すると、ビューを作成したように見えますが、実際にはビューにインデックスを作成していません。
if object_id(N'mytable1') is not null
drop table mytable1
if object_id(N'mytable2') is not null
drop table mytable2
go
Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO
insert into mytable1 values ('steve')
insert into mytable1 values ('jack')
insert into mytable1 values ('mike')
insert into mytable1 values ('ralph')
insert into mytable1 values ('simon')
insert into mytable2 values ('smith')
insert into mytable2 values ('jackson')
insert into mytable2 values ('mikaelson')
insert into mytable2 values ('montalvo')
insert into mytable2 values ('singer')
go
if object_id(N'myview') is not null
drop view myview
go
Create view myview
with schemabinding
as
select a.id, a.name1, b.name2
from dbo.mytable1 a
join dbo.mytable2 b on a.Id = b.Id
GO
select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO
このビューにはインデックスがないため、ベーステーブルをスキャンします。
しかし、インデックスを追加すると、オプティマイザはそれを使用できます。
CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
[name1] ASC,
[name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
これは適切にビューを使用しました:
テーブルではなくビューから選択するようにすべてのSQLスクリプトを変更することはできません。インデックス付きビューを作成し、SQL Serverにテーブルではなくビューからデータを取得させます。
クエリで参照されていないときにSQL Serverがインデックス付きビューを使用するように強制するヒントやその他の方法はありません。
追加情報(Geoff Pattersonから)
この場合、オプティマイザはEnterprise Editionのみでインデックス付きビューをNOEXPAND
使用できますが、使用されているビューインデックスを100%確認する必要がある場合は、ヒントを使用してビューを直接参照することは意味があります。 Standard Editionで使用したい場合。
Enterprise Editionでもクエリを頻繁に見ましたが、オプティマイザは、ビューインデックスが使用されない限り使用できるという事実を認識しませんNOEXPAND
。これは複雑なクエリでより一般的ですが、単純なクエリでも発生する可能性があります。
ポールホワイトは、私がのニュアンスを探求した中で読んだ優れた記事の 1つを持っていますNOEXPAND
。ヒントは、ビューインデックスの使用だけでなく、インデックス付きビューで統計が自動的に作成されるかどうか、プランの基数の見積もりなどにも影響を与える可能性があります。
そしてZaneから:補足として、更新、挿入、および削除の時間に追加される他のインデックスと同様に、インデックス付きビューに注意してください。