Indeks Praktik Terbaik yang Tidak Digunakan

11

Berdasarkan permintaan ini, jika saya melihat jumlah total pembacaan yang rendah (sangat dekat dengan 0 atau 0, seperti 1 atau 2) dan jumlah pembaruan pengguna yang tinggi atau sedang (saya tidak dapat menemukan sisipan atau menghapus dengan permintaan ini) dengan jumlah baris besar, secara teori saya harus menghapus indeks.

SELECT DISTINCT
    OBJECT_NAME(s.[object_id]) AS ObjectName
       , p.rows TableRows
       , i.name AS [INDEX NAME]
       , (user_seeks + user_scans + user_lookups) AS TotalReads
       , user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] 
        AND i.index_id = s.index_id 
    INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
       AND s.database_id = DB_ID()
       AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC

Saya ingin memeriksa ulang asumsi ini di sini. Misalnya, indeks yang sudah ada selama lebih dari setahun tetapi belum pernah dibaca, tetapi sangat diperbarui, sepertinya itu adalah ide yang buruk untuk dimiliki. Apakah ada skenario di mana asumsi ini tidak valid?

DoubleVu
sumber

Jawaban:

15

DMV ini hanya memelihara statistik sejak SQL Server terakhir restart; tampilan akan terhapus sepenuhnya dan semuanya dimulai dari awal.

Lebih penting lagi, baris dalam tampilan ini untuk setiap indeks spesifik dihapus ketika indeks itu dibangun kembali (tetapi tidak ketika itu ditata ulang). Jika Anda melakukan pemeliharaan indeks reguler, mungkin berguna untuk melihat log pemeliharaan dan melihat apakah ada indeks yang Anda pertimbangkan untuk dihapus mungkin telah dibangun kembali baru-baru ini.

Jadi, membuat keputusan berdasarkan pembacaan rendah sejak restart terakhir, ketika restart terakhir mungkin untuk pembaruan patch Selasa pekan lalu atau paket layanan kemarin, mungkin tidak bijaksana. Atau ketika Anda melakukan pemeliharaan indeks, sejak pembangunan kembali terakhir. Mungkin ada laporan yang hanya dijalankan sebulan sekali, atau sekali kuartal, atau setahun sekali, dan itu dijalankan oleh orang yang penting dan tidak sabar.

Selanjutnya, indeks mungkin ada untuk sesuatu yang akan terjadi di masa depan yang Anda tidak tahu - serangkaian laporan sedang dipersiapkan untuk musim pajak, katakanlah.

Jadi, saran saya adalah:

Gunakan DMV untuk mengidentifikasi indeks kandidat yang akan dihapus , tetapi jangan membuat keputusan itu dalam gelembung - Anda perlu melakukan kerja keras untuk menentukan mengapa indeks mungkin ada sebelum menjatuhkannya, bahkan jika sepertinya itu tidak sedang digunakan saat ini .

Aaron Bertrand
sumber
@ AaronBertrand Jadi, apakah akan melacak riwayat (bersama dengan waktu restart terakhir) menjadi tambahan yang bagus untuk ini? Terima kasih atas jawabannya.
DoubleVu
1
@DoubleVu ya, mempertahankan snapshot dari riwayat penggunaan indeks mungkin bermanfaat sehingga Anda dapat membuat keputusan yang berpendidikan yang tidak terpengaruh oleh apa pun yang dapat mengubah output dari statistik penggunaan DMV.
Aaron Bertrand
2

Yup tampilan hanya memiliki statistik sejak reboot terakhir. Untuk membantu mengurangi bahwa saya menyiapkan pekerjaan yang menjalankan kueri seperti yang Anda posting bulanan di pagi hari sebelum jendela pemeliharaan kami mulai menangkap informasi setiap bulan sebelum server reboot. Itu memungkinkan saya untuk kembali lebih jauh dan melihat tren dari waktu ke waktu. Saya juga memiliki permintaan kedua yang berlari mencari kemungkinan indeks yang hilang.

Satu hal yang perlu dipertimbangkan adalah indeks apa yang ada di meja. Mungkin tidak digunakan karena sebagian besar atau sepenuhnya merupakan duplikat dari indeks lain. Iya. SQL server memungkinkan Anda membuat dua indeks yang berbeda tetapi identik sehingga memungkinkan untuk sepenuhnya berlebihan.

Anda juga bisa melihat apa yang mungkin menjadi rencana kueri untuk kueri yang menggunakan indeks itu jika indeks itu dihapus. Apakah ada indeks lain untuk digunakan atau apakah itu kemungkinan harus kembali ke pemindaian tabel penuh.

Indeks akhirnya menjadi seni sebanyak itu sebagai sains karena sangat sulit untuk mengetahui segala sesuatu tentang apa yang mungkin dijalankan dan akhirnya sering berubah.

Evan Steinbrenner
sumber