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.
sql-server
sql-server-2014
materialized-view
Artashes Khachatryan
sumber
sumber
Jawaban:
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.
Karena tidak ada indeks pada tampilan ini, kami memindai pada tabel dasar:
Namun begitu kami menambahkan indeks, pengoptimal dapat menggunakannya:
Ini menggunakan pandangan:
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.
sumber
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:
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.
sumber