SQL Server - Kapan menggunakan Clustered vs non-Clustered Index?

99

Saya tahu perbedaan utama antara indeks berkerumun dan non berkerumun dan memiliki pemahaman tentang cara kerjanya. Saya memahami bagaimana indeks berkerumun dan non-berkerumun meningkatkan kinerja baca. Tetapi satu hal yang saya tidak yakin adalah apa yang akan menjadi alasan di mana saya akan memilih satu dari yang lain.

Sebagai contoh: Jika sebuah tabel tidak memiliki indeks berkerumun, haruskah seseorang membuat indeks non-cluster dan apa manfaatnya

armulator
sumber
3
Terima kasih telah menanggapi. Saya sudah menyadarinya. Pertanyaan saya adalah apakah akan ada situasi di mana membuat indeks non-cluster akan mendapat manfaat lebih dari membuat indeks berkerumun
armulator
2
Ya, Anda harus menghindari indeks berkerumun ketika; kolom memiliki kardinalitas rendah, tidak ada urutan tertentu, sering diperbarui, tidak berurutan, merupakan gabungan dari banyak kolom ...
TI
Terima kasih atas jawaban anda. Ini membantu
armulator
1
Mungkin pertanyaan ini akan membantu Anda: stackoverflow.com/questions/5070529/…
David García González
Kemungkinan duplikat dari Kolom apa yang harus diletakkan pada clustered index?
Michael Freidgeim

Jawaban:

117

Saya hanya ingin memberikan peringatan: harap dengan sangat hati-hati pilih indeks berkerumun Anda! Setiap tabel data "biasa" harus memiliki indeks berkerumun, karena memiliki indeks berkerumun memang mempercepat banyak operasi - ya, mempercepat , bahkan menyisipkan dan menghapus! Tetapi hanya jika Anda memilih indeks berkerumun yang baik .

Ini adalah struktur data yang paling banyak direplikasi dalam database SQL Server Anda. Kunci pengelompokan akan menjadi bagian dari setiap indeks non-cluster di tabel Anda juga.

Anda harus sangat berhati-hati saat memilih kunci pengelompokan - seharusnya:

  • sempit (ideal 4 byte)

  • unik (ini adalah "penunjuk baris". Jika Anda tidak membuatnya unik, SQL Server akan melakukannya untuk Anda di latar belakang, dikenakan biaya beberapa byte untuk setiap entri dikalikan jumlah baris dan jumlah indeks yang tidak terkluster Anda punya - ini bisa sangat mahal!)

  • statis (tidak pernah berubah - jika memungkinkan)

  • idealnya terus meningkat sehingga Anda tidak akan berakhir dengan fragmentasi indeks yang mengerikan (GUID adalah kebalikan dari kunci pengelompokan yang baik - karena alasan khusus itu)

  • itu harus non-nullable dan idealnya juga lebar tetap - a varchar(250)membuat kunci pengelompokan sangat buruk

Ada lagi yang benar-benar harus menjadi tingkat kepentingan kedua dan ketiga di belakang poin-poin ini ....

Lihat beberapa entri blog Kimberly Tripp ( Ratu Pengindeksan ) tentang topik ini - apa pun yang dia tulis di blognya benar-benar tak ternilai - baca, cerna - hidup dengan itu!

marc_s
sumber
1
Terima kasih marc_s untuk penjelasan yang jelas. Tapi secara teknis, apa yang dilakukan non clusteredindeks untuk kita. apa pentingnya ..?
hud
@nad: indeks non-cluster yang dipilih dengan baik dapat mempercepat pencarian Anda - daripada harus membandingkan jutaan baris data yang berpotensi dengan kriteria pencarian Anda, Anda dapat menemukan baris tertentu hanya dengan 4, 5 perbandingan. Itu membuat perbedaan BESAR !
marc_s
1
@MuriloKunze: baca posting blog Kim Tripp tentang topik tersebut - dia menjelaskan dengan sangat rinci mengapa ini terjadi
marc_s
5
Saya minta maaf, tetapi di mana jawaban atas pertanyaan "SQL Server - Kapan menggunakan Clustered vs non-Clustered Index?" ?
Eduard