Cara menentukan apakah Indeks diperlukan atau diperlukan

110

Saya telah menjalankan alat indeks-otomatis pada basis data MS SQL kami (saya memodifikasi skrip yang berasal dari Microsoft yang melihat tabel statistik indeks - Pengindeksan Otomatis Otomatis ). Dari statistik, saya sekarang memiliki daftar rekomendasi untuk indeks yang perlu dibuat.

Sunting: Indeks yang dijelaskan di atas mengambil informasi dari DMV yang memberi tahu Anda apa yang mesin database akan gunakan untuk indeks jika tersedia dan skrip mengambil rekomendasi x Top (dengan mencari, dampak pengguna, dll.) Dan meletakkannya di tabel.

(Sunting di atas sebagian diambil dari jawaban Larry Coleman di bawah ini untuk memperjelas apa yang dilakukan skrip)

Karena saya baru di admin basis data, dan telah melakukan pencarian cepat di internet, saya enggan untuk mengambil risiko dan secara membuta menambahkan indeks yang direkomendasikan. Namun, karena tidak berpengalaman di lapangan, saya mencari beberapa saran tentang bagaimana menentukan apakah rekomendasi itu perlu atau tidak.

Apakah saya perlu menjalankan SQL Profiler, atau lebih baik memeriksa kode yang menanyakan tabel? Dan apakah Anda punya saran lain?

misterjaytee
sumber
1
Lihat artikel ini sqlserverperformance.wordpress.com/2007/11/29/…
Igor Borisenko
periksa indeks yang tidak dapat digunakan. Artikel ini mungkin membantu Anda: sqlshack.com/...
Shiwangini Shishulkar

Jawaban:

80

Saya menggunakan skrip analisis indeks Jason Strate (Lokasi lama) . Mereka memberi tahu Anda berapa banyak indeks Anda yang ada digunakan serta berapa banyak indeks yang hilang akan digunakan. Saya biasanya tidak menambahkan indeks kecuali mereka membuat lebih dari 5 atau 10% dari kueri di atas meja.

Namun yang paling penting adalah memastikan aplikasi merespons cukup cepat bagi pengguna.

Pembaruan: artikel blog analisis indeks Jason Strate untuk skrip yang lebih baru (Lokasi baru)

Pembaruan Ganda: Saat ini, saya menggunakan sp_BlitzIndex® saat melakukan analisis indeks.

Jeremiah Peschka
sumber
perubahan apa yang kita butuhkan untuk menganalisis semua tabel?
MonsterMMORPG
1
sp_BlitzIndex akan melihat semua tabel di atas ukuran tertentu. Anda harus melihat dokumentasi untuk melihat bagaimana menyesuaikannya.
Jeremiah Peschka
Parameter untuk mengeksekusi sp_BlitzIndex ada di sini: brentozar.com/blitzindex
JackArbiter
ada pembaruan tiga?
Simon_Weaver
49

Ada beberapa konsep dan istilah yang penting untuk dipahami ketika berhadapan dengan indeks. Mencari, memindai, dan mencari adalah beberapa cara indeks akan digunakan melalui pernyataan pilihan. Selektivitas kolom kunci merupakan bagian integral untuk menentukan seberapa efektif suatu indeks.

Pencarian terjadi ketika SQL Server Query Optimizer menentukan bahwa cara terbaik untuk menemukan data yang Anda minta adalah dengan memindai rentang dalam indeks. Mencari biasanya terjadi ketika kueri "ditutupi" oleh indeks, yang berarti predikat pencarian ada di kunci indeks dan kolom yang ditampilkan berada di kunci atau disertakan. Pemindaian terjadi ketika SQL Server Query Optimizer menentukan bahwa cara terbaik untuk menemukan data adalah dengan memindai seluruh indeks dan kemudian menyaring hasil. Pencarian biasanya terjadi ketika indeks tidak menyertakan semua kolom yang diminta, baik di kunci indeks atau di kolom yang disertakan. Pengoptimal kueri kemudian akan menggunakan kunci berkerumun (terhadap indeks berkerumun) atau RID (terhadap heap) untuk "mencari" kolom yang diminta lainnya.

Biasanya, mencari operasi lebih efisien daripada pemindaian, karena secara fisik meminta set data yang lebih kecil. Ada situasi di mana ini bukan masalahnya, seperti kumpulan data awal yang sangat kecil, tetapi itu melampaui ruang lingkup pertanyaan Anda.

Sekarang, Anda bertanya bagaimana menentukan seberapa efektif suatu indeks, dan ada beberapa hal yang perlu diingat. Kolom kunci indeks berkerumun disebut kunci pengelompokan. Ini adalah bagaimana catatan dibuat unik dalam konteks indeks berkerumun. Semua indeks nonclustered akan menyertakan kunci yang dikelompokkan secara default, untuk melakukan pencarian ketika diperlukan. Semua indeks akan dimasukkan, diperbarui, atau dihapus dari untuk setiap pernyataan DML masing-masing. Yang telah dikatakan, yang terbaik adalah menyeimbangkan kenaikan kinerja dalam pernyataan pilih terhadap hit kinerja dalam menyisipkan, menghapus, dan memperbarui pernyataan.

Untuk menentukan seberapa efektif indeks, Anda harus menentukan selektivitas kunci indeks Anda. Selektivitas dapat didefinisikan sebagai persentase dari catatan yang berbeda terhadap total catatan. Jika saya memiliki tabel [orang] dengan 100 catatan total dan kolom [first_name] berisi 90 nilai yang berbeda, kita dapat mengatakan bahwa kolom [first_name] adalah 90% selektif. Semakin tinggi selektivitas, semakin efisien kunci indeks. Mempertahankan selektivitas dalam pikiran, yang terbaik adalah menempatkan kolom paling selektif Anda terlebih dahulu di kunci indeks Anda. Menggunakan contoh [orang] saya sebelumnya, bagaimana jika kami memiliki kolom [nama_k belakang] yang selektif 95%? Kami ingin membuat indeks dengan [last_name], [first_name] sebagai kunci indeks.

Saya tahu ini adalah jawaban yang agak bertele-tele, tetapi sebenarnya ada banyak hal yang menentukan seberapa efektif suatu indeks, dan banyak hal yang harus Anda pertimbangkan jika ada kenaikan kinerja.

Matt M
sumber
1
Saya hanya ingin menekankan pada apa yang telah dikatakan di atas: Indeks memperlambat insert / delete Anda dan pembaruan. Jika Anda harus mengatakan memasukkan sejumlah besar data dalam jumlah besar, Anda lebih baik tanpa indeks (Anda dapat membuatnya setelah itu, lebih cepat).
Nicolas de Fontenay
Apakah benar menyebutkan bahwa indeks pada kolom [last_name], [first_name] hanya dapat digunakan jika kueri akan memfilter pada last_name dan first_name? Jika hanya memfilter pada first_name, indeks tidak dapat digunakan, bukan?
Magier
Jawaban yang bagus - Selektivitas lebih penting daripada kardinalitas ketika memutuskan apakah akan melakukan indeks
Reversed Engineer
27

Saya baru-baru ini menemukan skrip gratis yang fantastis dari orang-orang di BrentOzar Unltd http://www.brentozar.com/blitzindex/

Ini melakukan beberapa analisis yang baik dari indeks mana yang ada, seberapa sering mereka digunakan dan seberapa sering mesin query mencari indeks yang tidak ada.

Bimbingannya umumnya baik. Kadang-kadang itu menjadi terlalu sugestif terhadap ide. Saya umumnya telah melakukan hal berikut sejauh ini:

  • Indeks yang dihapus yang belum pernah dibaca (atau mungkin kurang dari 50 kali sebulan).
  • Menambahkan indeks yang paling jelas pada kunci dan bidang asing. Saya tahu kami banyak menggunakan.

Saya belum menambahkan semua indeks yang direkomendasikan, dan telah kembali seminggu kemudian untuk menemukan bahwa mereka tidak lagi direkomendasikan karena mesin pencarian menggunakan beberapa indeks baru lainnya sebagai gantinya!

Secara umum Anda harus menghindari indeks pada:

  • Tabel sangat kecil (kurang dari 50 hingga 200 catatan): seringkali mesin kueri lebih cepat jika memindai tabel daripada memuat indeks, membaca, memprosesnya dll.
  • Hindari indeks pada kolom dengan Kardinalitas Rendah ( http://en.wikipedia.org/wiki/Cardinality_(SQL_statements) ) pada kolom yang disebutkan pertama. Misalnya, pengindeksan bidang gender (M / F) sangat sedikit digunakan, sama praktisnya untuk memindai tabel dan menemukan ~ 50% yang cocok. Jika itu terdaftar setelah sesuatu yang lebih spesifik dalam indeks (mis. [Tanggal lahir, jenis kelamin]) lebih baik - Anda mungkin ingin semua pria yang lahir dalam rentang waktu tertentu.

Indeks Clustered baik - biasanya ini didasarkan pada kunci utama Anda. Mereka membantu mesin database menempatkan data pada disk dengan baik. Sangat penting untuk memahami ini untuk tabel terbesar karena indeks berkerumun yang baik sering mengurangi ruang yang ditempati tabel.

Saya telah mengurangi beberapa tabel dari 900MB menjadi 400MB, hanya karena mereka tumpukan yang tidak terstruktur sebelumnya. http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

Atur kembali / Bangun Kembali

Anda harus mencari untuk memeriksa indeks terfragmentasi. Sedikit fragmentasi tidak apa-apa, jangan obsesif! http://technet.microsoft.com/en-us/library/ms189858.aspx Ketahui perbedaan antara mengatur ulang dan membangun kembali!

Tinjau secara teratur

Kueri berubah, volume data berubah, fitur baru ditambahkan, yang lama dihapus. Anda harus melihat mereka sebulan sekali (atau lebih sering jika Anda memiliki volume tinggi) dan mencari di mana Anda dapat membantu database!

Berapa banyak

Dalam video terbaru, Brent merekomendasikan (biasanya) tidak lebih dari 5 indeks di atas meja dengan banyak tulisan (misalnya tabel pesanan), dan tidak lebih dari 10 jika dibaca lebih banyak daripada yang tertulis (mis. Tabel pencatatan analitik) http: / /www.youtube.com/watch?v=gOsflkQkHjg

Secara keseluruhan

Tergantung!

Jarak tempuh Anda bervariasi sesuai dengan basis data. Tutupi jelas (nama keluarga karyawan, tanggal pesanan dll) pada tabel Anda (sekarang / masa depan) yang lebih besar. Pantau, tinjau, dan sesuaikan seperlunya. Itu harus menjadi bagian dari daftar periksa rutin Anda ketika mengelola basis data Anda :)

Semoga ini membantu!

Greg Robson
sumber
14

Biasanya seseorang pergi dengan memiliki beban kerja tertentu (permintaan) dan dengan hati-hati menguji dampak dari setiap indeks baru pada beban kerja. Proses berulang ini harus selalu mencakup analisis cermat dari rencana eksekusi, yang akan mengungkapkan indeks apa yang digunakan. Topik menganalisis kueri adalah panjang, dan dimulai dengan bab MSDN khusus Menganalisis Kueri adalah taruhan yang bagus.

Kadang-kadang ketika beban kerja terlalu kompleks atau pengetahuan tentang desain basis data tidak jelas, seseorang menggunakan Penasihat Penyesuaian Basis Data Engine , yang melakukan beberapa analisis otomatis terhadap beban kerja Anda dan mengusulkan beberapa indeks. Proposal harus, tentu saja, dianalisis dengan cermat dan dampaknya harus segera diukur.

Jadi jika Anda mengikuti ide saya, menambahkan indeks dan mengukur dampak sebenarnya hanya merupakan kasus pengujian A / B : Anda menjalankan beban kerja Anda tanpa indeks sebagai garis dasar, kemudian Anda menjalankannya dengan indeks, mengukur dan membandingkan dengan garis dasar dan kemudian memutuskan, berdasarkan metrik yang diamati dan diukur, jika dampaknya menguntungkan. Beban kerja terbaik adalah test suite yang berkualitas baik, tetapi juga bisa menjadi replay dari beban kerja yang ditangkap, lihat Cara: Memutar Ulang File Jejak .

Jawaban yang lebih sintetik adalah dengan melihat pada sys.dm_db_index_usage_statspandangan dan melihat bagaimana indeks digunakan, tetapi itu biasanya merupakan pendekatan untuk melakukan analisis di tempat pada beban kerja yang tidak diketahui (mis. Konsultan yang dipanggil untuk membantu mungkin akan mulai dengan ini).

Remus Rusanu
sumber
7

Dimulai dengan SQL 2005, SQL Server memiliki DMV yang memberi tahu Anda apa mesin database akan digunakan untuk indeks jika mereka tersedia. Tampilan dapat memberi tahu Anda kolom mana yang harus menjadi kolom kunci, kolom mana yang harus dimasukkan, dan yang paling penting, berapa kali indeks akan digunakan.

Pendekatan yang baik adalah dengan mengurutkan permintaan indeks yang hilang berdasarkan jumlah pencarian, dan pertimbangkan untuk menambahkan indeks teratas terlebih dahulu.

Lihat juga: dokumen resmi MS DMV

Larry Coleman
sumber
-1

Itu tergantung pada bagaimana tabel itu digunakan. mis. katakanlah saya memiliki tabel yang sering dibaca tetapi pembaruan dan sisipan jarang. Ditambah lagi, saya selalu menanyakan tabel pada beberapa kolom kunci asing. Masuk akal untuk membuat (non clustered) indeks atas kunci asing itu untuk mempercepat permintaan baca. Tapi sisi buruknya adalah, sisipan Anda, pembaruan akan menjadi lambat.

Ada beberapa permintaan statistik yang memberi tahu berapa banyak waktu yang dibutuhkan. Mulailah dengan yang paling lambat. Jika predikat kueri tidak memiliki indeks, membuat satu akan membantu.

Ankush
sumber