it-swarm.asia

Cara menentukan apakah Indeks diperlukan atau diperlukan

Saya telah menjalankan alat indeks-otomatis pada database 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.

Edit: Indeks yang dijelaskan di atas mengambil informasi dari DMV yang memberi tahu Anda apa yang akan digunakan mesin database untuk indeks jika tersedia dan skrip ambil rekomendasi Top x (dengan mencari, dampak pengguna, dll.) dan letakkan ini dalam 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?

112
misterjaytee

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: Hari ini, saya menggunakan sp_BlitzIndex® saat melakukan analisis indeks.

81

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 set 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 disisipkan ke, 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 kita 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.

51
Matt M

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 pencarian 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 terdaftar setelah sesuatu yang lebih spesifik dalam indeks (mis. [Tanggal lahir, jenis kelamin]) lebih baik - Anda mungkin menginginkan 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

Reorganisasi/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 (mis. 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, 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!

29
Greg Robson

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 yang 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 Database Engine Tuning Advisor , 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, maka 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 paket uji kualitas yang baik, tetapi juga bisa menjadi replay dari beban kerja yang ditangkap, lihat Cara: Memutar Ulang File Jejak .

Jawaban yang lebih sintetik adalah dengan melihat sys.dm_db_index_usage_stats melihat 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).

14
Remus Rusanu

Dimulai dengan SQL 2005, SQL Server memiliki DMV yang memberi tahu Anda apa yang mesin database akan gunakan untuk indeks jika 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

8
Larry Coleman