Kami memiliki database yang sangat besar dengan ratusan indeks yang tidak digunakan menurut statistik DMV, yang telah terakumulasi sejak server terakhir kali di-boot ulang pada bulan Juli. Salah satu DBA kami membuat pernyataan peringatan berikut, yang tidak masuk akal bagi saya:
- Sebelum kita menjatuhkan indeks, kita perlu memastikan jika tidak menerapkan batasan keunikan, karena pengoptimal kueri mungkin memerlukan indeks ini untuk ada.
- Setiap kali Indeks dibuat, statistik yang terkait dengan indeks itu juga dibuat di SQL Server. Kueri mungkin tidak menggunakan indeks tetapi mungkin menggunakan statistiknya. Jadi kita dapat mengalami situasi, setelah menjatuhkan indeks kinerja permintaan tertentu menjadi sangat buruk. SQL Server tidak menyimpan statistik penggunaan statistik. Meskipun kami memiliki fitur "Buat Statistik Otomatis" yang diaktifkan pada basis data kami, saya tidak tahu semua parameter harus dipenuhi secara internal sebelum pengoptimal kueri akan membuat statistik yang hilang.
Mengenai # 1, menurut saya SQL Server akan benar-benar melakukan pencarian pada indeks untuk menentukan keunikan sebelum penyisipan / pembaruan dilakukan, dan oleh karena itu, indeks tidak akan ditampilkan sebagai tidak digunakan.
Mengenai # 2, apakah ini benar-benar mungkin?
Omong-omong, ketika saya mengatakan indeks tidak digunakan, maksud saya tidak mencari dan tidak memindai.
sql-server
index
Randy Minder
sumber
sumber
Jawaban:
Kekhawatiran DBA Anda keduanya valid.
Jaminan keunikan dapat digunakan oleh pengoptimal dalam memutuskan transformasi logis atau operasi fisik yang dapat digunakan untuk mendapatkan hasil yang benar. Fakta bahwa pengoptimal bergantung pada jaminan keunikan, misalnya, mengubah agregasi atau memilih gabungan satu-ke-banyak, tidak akan tercermin dalam statistik penggunaan indeks, kecuali indeks juga diakses secara fisik dalam rencana pelaksanaan akhir . Karena itu seseorang harus sangat berhati-hati menghapus (atau menonaktifkan) indeks atau batasan unik.
Ya, pengoptimal dimungkinkan untuk menggunakan statistik yang terkait dengan indeks tanpa rencana eksekusi akhir yang menampilkan akses apa pun menggunakan indeks itu. Proses memuat statistik 'menarik', menghitung perkiraan kardinalitas, dan menghasilkan rencana eksekusi yang sudah selesai adalah kegiatan yang cukup independen.
Menjatuhkan indeks juga akan menghapus statistik indeks terkait, yang dapat memengaruhi kualitas paket saat pernyataan itu disusun ulang. Statistik indeks dapat digunakan dalam perhitungan estimasi kardinalitas yang menjadi sandaran rencana akhir, bahkan ketika indeks tidak secara fisik ada dalam rencana akhir.
DBA Anda mengetahui barang-barangnya.
Tak satu pun dari ini harus diambil berarti bahwa indeks yang tampaknya tidak digunakan tidak boleh dihapus. Saya hanya mengatakan bahwa masalah DBA Anda adalah masalah yang valid, dan Anda harus merencanakan perubahan sesuai dengan itu, dengan pengujian yang sesuai, dan rencana pemulihan. Dalam pengalaman saya, poin # 1 lebih cenderung bermasalah daripada # 2, tapi saya tidak punya cara untuk mengetahui apakah itu berlaku untuk situasi Anda.
sumber