Tampilan diindeks dalam SQL Server

11

Saya punya tabel dan tampilan indeks seperti itu

Create table mytable1 (ID int identity(1,1), Name nvarchar(100))

Create table mytable2 (ID int identity(1,1), Name nvarchar(100))

Create view myview 
with schemabinding 
as 
   select a.name, b.name
   from mytable1 a 
   join mytable2 b on a.Id = b.Id

Sekarang jika saya menjalankan kueri berikut

select a.name, b.name
from mytable1 a 
join mytable2 b on a.Id = b.Id

Itu tidak menggunakan tampilan indeks saya. Apakah ada petunjuk (atau cara lain) untuk memaksa SQL Server menggunakan tampilan yang diindeks?

Saya memiliki sistem besar, dan perlu mengoptimalkannya. 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.

Saya menggunakan SQL Server 2014 Enterprise Edition.

Artashes Khachatryan
sumber
Saya memiliki sistem besar, dan perlu mengoptimalkannya. Saya tidak dapat 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.
Artashes Khachatryan

Jawaban:

23

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: masukkan deskripsi gambar di sini

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: masukkan deskripsi gambar di sini

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 NOEXPANDpetunjuk 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 NOEXPANDdigunakan. 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.

lebah
sumber
-5

Jika Anda tidak dapat mengubah kode aplikasi Anda menjadi nama objek baru, mungkin Anda dapat mengubah pengguna aplikasi Anda untuk menggunakan skema default baru dan membuat tampilan indeks dalam skema lain menggunakan nama objek yang sama? Misalnya:

create view iv.MyTest 
as 
 select Col1, Col2 from dbo.MyTest 

Tentu saja ini hanya akan berfungsi jika Anda belum menggunakan nama skema dalam kode aplikasi.

Jika sudah, Anda bisa mencoba memindahkan semua objek ke skema baru dan sebagai gantinya memperkenalkan pandangan dalam skema lama.

Magier
sumber