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?
sumber
Jawaban:
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.
sumber
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.
sumber
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:
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:
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!
sumber
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_stats
pandangan 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).sumber
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
sumber
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.
sumber