Saya membangun pandangan yang diindeks dalam SQL Server sepanjang waktu untuk menyempurnakan produk yang ada. Pengoptimal cukup pintar untuk menggunakan indeks jika Anda menggunakan kolom yang sesuai.
Menggunakan contoh Anda, sepertinya Anda membuat tampilan tetapi tidak benar-benar membuat indeks di atasnya.
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
Karena tidak ada indeks pada tampilan ini, kami memindai pada tabel dasar:
Namun begitu kami menambahkan indeks, pengoptimal dapat menggunakannya:
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
Ini menggunakan pandangan:
Saya tidak bisa mengubah semua skrip SQL saya untuk memilih dari tampilan daripada tabel. Saya ingin membuat tampilan yang diindeks dan memaksa SQL Server untuk mendapatkan data dari mereka bukan tabel.
Tidak ada petunjuk atau metode lain untuk memaksa SQL Server menggunakan tampilan yang diindeks ketika tidak direferensikan dalam kueri.
Informasi tambahan (dari Geoff Patterson )
Satu poin tambahan adalah bahwa sementara pengoptimal dapat, dalam Edisi Perusahaan saja, menggunakan tampilan yang diindeks dalam hal ini, mungkin masuk akal untuk secara langsung mereferensikan tampilan menggunakan NOEXPAND
petunjuk jika Anda perlu 100% yakin dengan indeks tampilan yang digunakan atau jika Anda ingin menggunakannya dalam Edisi Standar.
Saya sering melihat kueri bahkan dalam Enterprise Edition di mana pengoptimal tidak memahami fakta bahwa indeks tampilan dapat digunakan kecuali NOEXPAND
digunakan. Ini lebih umum dengan permintaan kompleks, tetapi bisa terjadi dengan permintaan sederhana juga.
Paul White memiliki salah satu artikel yang lebih baik yang saya baca menjelajahi nuansa NOEXPAND
; Selain penggunaan indeks tampilan, petunjuk ini juga dapat memengaruhi hal-hal seperti apakah statistik secara otomatis dibuat pada tampilan yang diindeks dan perkiraan kardinalitas untuk rencana tersebut.
Dan dari Zane : Sebagai catatan, berhati-hatilah dengan tampilan yang diindeks seperti indeks lainnya yang akan menambah pembaruan Anda, masukkan, dan hapus waktu.