Saya pernah mendengar bahwa Anda harus meletakkan kolom yang paling selektif di awal deklarasi indeks. Contoh:
CREATE NONCLUSTERED INDEX MyINDX on Table1
(
MostSelective,
SecondMost,
Least
)
Pertama, apakah yang saya katakan benar? Jika demikian, apakah saya cenderung melihat perbedaan besar dalam kinerja dengan menata ulang urutan kolom dalam indeks saya atau apakah ini lebih merupakan praktik "menyenangkan untuk dilakukan"?
Alasan saya bertanya adalah karena setelah memasukkan kueri melalui DTA, saya merekomendasikan agar saya membuat indeks yang memiliki hampir semua kolom yang sama di dalamnya sebagai indeks yang ada, hanya dalam urutan yang berbeda. Saya sedang mempertimbangkan hanya menambahkan kolom yang hilang ke indeks yang ada dan menyebutnya baik. Pikiran?
sumber
Urutan kolom sangat penting. Sekarang urutan mana yang benar itu tergantung pada bagaimana Anda akan menanyakannya. Indeks dapat digunakan untuk melakukan pencarian yang tepat atau pemindaian rentang. Pencarian tepat adalah ketika nilai untuk semua kolom dalam indeks ditentukan dan kueri mendarat tepat pada baris yang diinginkan. Untuk mencari urutan kolom tidak relevan. Pemindaian rentang adalah ketika hanya beberapa kolom yang ditentukan, dan dalam hal ini ketika urutan menjadi penting. SQL Server dapat menggunakan indeks untuk pemindaian rentang hanya jika kolom paling kiri ditentukan, dan kemudian hanya jika kolom paling kiri berikutnya ditentukan, dan seterusnya. Jika Anda memiliki indeks pada (A, B, C) dapat digunakan untuk rentang pemindaian
A=@a
, untukA=@a AND B=@b
tetapi tidak untukB=@b
, untukC=@c
atauB=@b AND C=@c
. KasingA=@a AND C=@c
dicampur satu, seperti dalamA=@a
porsi akan menggunakan indeks, tetapiC=@c
tidak (kueri akan memindai semua nilai B untukA=@a
, tidak akan 'lewati' keC=@c
). Sistem basis data lain memiliki apa yang disebut operator 'skip scan' yang dapat mengambil keuntungan dari kolom dalam dalam indeks ketika kolom luar tidak ditentukan.Dengan pengetahuan itu di tangan Anda dapat melihat definisi indeks lagi. Indeks aktif hanya
(MostSelective, SecondMost, Least)
akan efektif bilaMostSelective
kolom ditentukan. Tapi itu yang paling selektif, relevansi kolom batin akan cepat menurun. Sangat sering Anda akan menemukan bahwa indeks yang lebih baik aktif(MostSelective) include (SecondMost, Least)
atau aktif(MostSelective, SecondMost) include (Least)
. Karena kolom dalam kurang relevan, menempatkan kolom selektivitas rendah di posisi yang tepat dalam indeks membuat mereka tidak lebih dari derau untuk pencarian, jadi masuk akal untuk memindahkannya dari halaman perantara dan menyimpannya hanya di halaman daun, untuk tujuan cakupan permintaan. Dengan kata lain, pindahkan ke TERMASUK. Ini menjadi lebih penting karena ukuranLeast
kolom bertambah. Idenya adalah bahwa indeks ini hanya dapat menguntungkan kueri yang menentukanMostSelective
baik sebagai nilai yang tepat atau rentang, dan kolom yang paling selektif itu sudah membatasi baris kandidat.Di sisi lain indeks pada
(Least, SecondMost, MostSelective)
mungkin tampak kesalahan, tetapi sebenarnya indeks yang cukup kuat. Karena memilikiLeast
kolom sebagai kueri terluarnya, ia dapat digunakan untuk kueri yang harus mengumpulkan hasil pada kolom selektivitas rendah. Pertanyaan seperti itu lazim di OLAP dan analisis gudang data, dan di sinilah tepatnya indeks tersebut memiliki kasus yang sangat baik untuk mereka. Indeks tersebut sebenarnya membuat indeks berkerumun sangat baik , tepatnya karena mereka mengatur tata letak fisik pada potongan besar dari baris terkait (Least
nilai yang sama , yang biasanya menunjukkan semacam kategori atau jenis) dan mereka memfasilitasi permintaan analisis.Jadi, sayangnya, tidak ada pesanan yang 'benar'. Anda tidak boleh mengikuti resep pemotong kue apa pun melainkan menganalisis pola kueri yang akan Anda gunakan terhadap tabel itu dan memutuskan urutan kolom indeks mana yang benar.
sumber
Seperti yang dikatakan Remus tergantung pada beban kerja Anda.
Saya ingin membahas aspek yang menyesatkan dari jawaban yang diterima.
Untuk kueri yang melakukan pencarian kesetaraan pada semua kolom dalam indeks, tidak ada perbedaan yang signifikan.
Di bawah ini membuat dua tabel dan mengisinya dengan data yang identik. Satu-satunya perbedaan adalah bahwa salah satu memiliki kunci yang dipesan dari yang paling selektif dan yang lainnya terbalik.
Sekarang melakukan kueri terhadap kedua tabel ...
... Keduanya menggunakan denda indeks dan keduanya diberi biaya yang sama persis.
Seni ASCII dalam jawaban yang diterima sebenarnya bukan bagaimana indeks disusun. Halaman indeks untuk Table1 diwakili di bawah ini (klik gambar untuk membuka dalam ukuran penuh).
Halaman indeks berisi baris yang berisi seluruh kunci (dalam hal ini sebenarnya ada kolom kunci tambahan yang ditambahkan untuk pengidentifikasi baris karena indeks tidak dinyatakan sebagai unik tetapi yang dapat diabaikan informasi lebih lanjut tentang ini dapat ditemukan di sini ).
Untuk kueri di atas SQL Server tidak peduli dengan selektivitas kolom. Itu melakukan pencarian biner dari halaman root dan menemukan bahwa Key
(PPP...,3,~ )
adalah>=(JJJ...,1,~ )
dan< (SSS...,3,~ )
karena itu harus membaca halaman1:118
. Kemudian melakukan pencarian biner dari entri kunci pada halaman itu dan menemukan halaman daun untuk melakukan perjalanan.Mengubah indeks dalam urutan selektivitas tidak memengaruhi jumlah perbandingan kunci yang diharapkan dari pencarian biner atau jumlah halaman yang perlu dinavigasi untuk melakukan pencarian indeks. Paling-paling itu mungkin sedikit mempercepat perbandingan kunci itu sendiri.
Kadang-kadang memesan indeks yang paling selektif terlebih dahulu akan masuk akal untuk pertanyaan lain dalam beban kerja Anda.
Misalnya jika beban kerja berisi kueri dari kedua formulir berikut.
Indeks di atas tidak mencakup keduanya.
MostSelective
cukup selektif untuk membuat rencana dengan pencarian dan pencarian bermanfaat tetapi permintaan terhadapLeast
tidak.Namun skenario ini (pencarian non-cakupan indeks pada subset kolom utama dari indeks komposit) hanya satu kelas query yang mungkin dapat dibantu oleh indeks. Jika Anda tidak pernah benar-benar mencari
MostSelective
sendiri atau kombinasi dariMostSelective, SecondMost
dan selalu mencari dengan kombinasi ketiga kolom maka keuntungan teoretis ini tidak berguna bagi Anda.Sebaliknya, pertanyaan seperti
Akan terbantu dengan memiliki urutan terbalik dari yang biasa ditentukan - karena mencakup permintaan, dapat mendukung pencarian dan mengembalikan baris dalam urutan yang diinginkan untuk boot.
Jadi ini adalah saran yang sering diulang, tetapi paling tidak heuristik tentang manfaat potensial untuk pertanyaan lain - dan itu bukan pengganti untuk benar-benar melihat beban kerja Anda .
sumber
Benar. Indeks dapat berupa komposit - terdiri dari banyak kolom - dan urutannya penting karena prinsip paling kiri. Alasannya adalah, bahwa database memeriksa daftar dari kiri ke kanan, dan harus menemukan referensi kolom yang sesuai dengan urutan yang ditentukan. Misalnya, memiliki indeks pada tabel alamat dengan kolom:
Setiap kueri yang menggunakan
address
kolom dapat memanfaatkan indeks, tetapi jika kueri hanya memiliki salah satucity
dan / ataustate
referensi - indeks tidak dapat digunakan. Ini karena kolom paling kiri tidak dirujuk. Kinerja kueri akan memberi tahu Anda mana yang optimal - indeks individual, atau beberapa komposit dengan pesanan berbeda. Bacaan baik: The Tipping Point , oleh Kimberley Trippsumber
Semua jawaban lainnya salah.
Selektivitas kolom individu dalam indeks komposit tidak masalah ketika memilih pesanan.
Ini adalah proses berpikir sederhana: Secara efektif, indeks adalah gabungan kolom-kolom yang terlibat.
Memberikan alasan itu, satu-satunya perbedaan adalah membandingkan dua 'string' yang berbeda sebelumnya dibandingkan kemudian dalam string. Ini adalah bagian kecil dari total biaya. Tidak ada "pass pertama / pass kedua", sebagaimana disebutkan dalam satu Jawaban.
Jadi, pesanan apa yang harus digunakan?
=
, dalam urutan apa pun .Misalnya, kolom selektivitas yang sangat rendah harus didahulukan dalam hal ini:
Menukar urutan dalam indeks akan membuatnya benar-benar diabaikan
deleted
.(Ada lebih banyak aturan untuk memesan kolom.)
sumber
deleted
tidak banyak membantu dalam menyaring baris yang tidak diinginkan. Apakah Anda memiliki contoh yang lebih baik? (Itulah yang muncul di benak saya ketika saya menulis Jawaban.)