Apa perbedaan antara a clustered
dan a non-clustered index
?
sql-server
indexing
clustered-index
non-clustered-index
Eric Labashosky
sumber
sumber
Jawaban:
Indeks Berkelompok
Indeks Non Clustered
Kedua jenis indeks akan meningkatkan kinerja saat memilih data dengan bidang yang menggunakan indeks tetapi akan memperlambat pembaruan dan menyisipkan operasi.
Karena lambat memasukkan dan memperbarui indeks berkerumun harus ditetapkan pada bidang yang biasanya tambahan yaitu Id atau Stempel Waktu.
SQL Server biasanya hanya akan menggunakan indeks jika selektivitasnya di atas 95%.
sumber
Indeks yang dikelompokkan secara fisik memesan data pada disk. Ini berarti tidak diperlukan data tambahan untuk indeks, tetapi hanya ada satu indeks berkerumun (jelas). Mengakses data menggunakan indeks berkerumun adalah yang tercepat.
Semua indeks lain harus non-cluster. Indeks non-clustered memiliki duplikat data dari kolom yang diindeks terus dipesan bersama dengan pointer ke baris data aktual (pointer ke indeks clustered jika ada). Ini berarti bahwa mengakses data melalui indeks non-cluster harus melalui lapisan tipuan ekstra. Namun, jika Anda hanya memilih data yang tersedia di kolom yang diindeks Anda dapat memperoleh kembali data secara langsung dari data indeks yang digandakan (itu sebabnya adalah ide yang baik untuk SELECT hanya kolom yang Anda butuhkan dan tidak menggunakan *)
sumber
Indeks yang dikelompokkan disimpan secara fisik di atas meja. Ini berarti mereka adalah yang tercepat dan Anda hanya dapat memiliki satu indeks berkerumun per tabel.
Indeks non-cluster disimpan secara terpisah, dan Anda dapat memiliki sebanyak yang Anda inginkan.
Pilihan terbaik adalah mengatur indeks berkerumun Anda pada kolom unik yang paling sering digunakan, biasanya PK. Anda harus selalu memiliki indeks cluster yang dipilih dengan baik di tabel Anda, kecuali alasan yang sangat menarik - tidak bisa memikirkan satu pun, tapi hei, mungkin ada di luar sana - karena tidak melakukannya muncul.
sumber
Indeks Berkelompok
Indeks Non-Clustered
sumber
Indeks Berkelompok
Indeks Non Clustered
Terlepas dari perbedaan ini, Anda harus tahu bahwa ketika tabel non-clustered (ketika tabel tidak memiliki indeks clustered) file data tidak teratur dan menggunakan Heap data structure sebagai struktur data.
sumber
Clustered pada dasarnya berarti bahwa data berada dalam urutan fisik dalam tabel. Inilah sebabnya mengapa Anda hanya dapat memiliki satu per tabel.
Unclustered artinya "hanya" urutan logis.
sumber
Pro:
Indeks yang dikelompokkan bekerja sangat baik untuk rentang (mis. Pilih * dari my_table di mana my_key antara @min dan @max)
Dalam beberapa kondisi, DBMS tidak perlu melakukan pekerjaan untuk mengurutkan jika Anda menggunakan pernyataan orderby.
Cons:
Indeks yang dikelompokkan dapat memperlambat sisipan karena tata letak fisik catatan harus dimodifikasi karena catatan dimasukkan jika kunci baru tidak berurutan.
sumber
Indeks berkerumun pada dasarnya adalah salinan data yang diurutkan dalam kolom yang diindeks.
Keuntungan utama dari indeks berkerumun adalah bahwa ketika kueri Anda (mencari) menemukan data dalam indeks maka tidak diperlukan IO tambahan untuk mengambil data itu.
Overhead mempertahankan indeks berkerumun, terutama dalam tabel yang sering diperbarui, dapat menyebabkan kinerja yang buruk dan karena itu mungkin lebih baik untuk membuat indeks yang tidak berkerumun.
sumber
Basis data yang diindeks memiliki dua bagian: satu set catatan fisik, yang diatur dalam beberapa urutan arbitrer, dan satu set indeks yang mengidentifikasi urutan di mana catatan harus dibaca untuk menghasilkan hasil yang diurutkan berdasarkan beberapa kriteria. Jika tidak ada korelasi antara pengaturan fisik dan indeks, maka pembacaan semua catatan secara berurutan mungkin memerlukan banyak operasi pembacaan tunggal-rekaman yang independen. Karena database mungkin dapat membaca lusinan catatan berturut-turut dalam waktu kurang dari yang dibutuhkan untuk membaca dua catatan non-berturut-turut, kinerja dapat ditingkatkan jika catatan yang berturut-turut dalam indeks juga disimpan secara berurutan di disk.
Sebagai contoh, jika seseorang memulai dengan basis data non-cluster kosong dan menambahkan 10.000 catatan dalam urutan acak, catatan tersebut kemungkinan akan ditambahkan pada akhir sesuai urutan penambahannya. Membacakan basis data berdasarkan indeks akan membutuhkan 10.000 pembacaan satu catatan. Namun, jika seseorang menggunakan database berkerumun, sistem mungkin memeriksa ketika menambahkan setiap catatan apakah catatan sebelumnya disimpan dengan sendirinya; jika ternyata itu masalahnya, ia mungkin menulis catatan itu dengan yang baru di akhir basis data. Itu kemudian bisa melihat catatan fisik sebelum slot di mana catatan dipindahkan digunakan untuk tinggal dan melihat apakah catatan yang mengikuti itu disimpan dengan sendirinya. Jika ternyata itu masalahnya, maka bisa memindahkan catatan itu ke tempat itu. Menggunakan pendekatan semacam ini akan menyebabkan banyak catatan dikelompokkan bersama menjadi dua,
Pada kenyataannya, database yang dikelompokkan menggunakan algoritma yang lebih canggih dari ini. Namun, hal utama yang perlu diperhatikan adalah bahwa ada pertukaran antara waktu yang diperlukan untuk memperbarui database dan waktu yang diperlukan untuk membacanya secara berurutan. Mempertahankan basis data berkerumun akan secara signifikan meningkatkan jumlah pekerjaan yang diperlukan untuk menambah, menghapus, atau memperbarui catatan dengan cara apa pun yang akan memengaruhi urutan pengurutan. Jika database akan dibaca berurutan lebih sering daripada diperbarui, pengelompokan bisa menjadi kemenangan besar. Jika akan sering diperbarui tetapi jarang dibaca secara berurutan, pengelompokan dapat menguras kinerja besar, terutama jika urutan item yang ditambahkan ke database tidak tergantung pada urutan pengurutannya terkait dengan indeks berkerumun.
sumber
Indeks berkerumun sebenarnya menggambarkan urutan penyimpanan catatan secara fisik di disk, maka alasannya Anda hanya dapat memilikinya.
Indeks Non-Clustered mendefinisikan urutan logis yang tidak cocok dengan urutan fisik pada disk.
sumber
Anda mungkin telah melalui bagian teori dari posting di atas:
-Indeks berkerumun seperti yang kita dapat melihat poin langsung untuk dicatat yaitu langsung sehingga dibutuhkan lebih sedikit waktu untuk pencarian. Selain itu tidak akan membutuhkan memori / ruang ekstra untuk menyimpan indeks
-Sementara itu, dalam Index non-clustered, secara tidak langsung menunjuk ke Index clustered maka akan mengakses catatan aktual, karena sifat tidak langsungnya akan memerlukan beberapa waktu lebih lama untuk diakses. Juga membutuhkan memori / ruang sendiri untuk menyimpan indeks
sumber
// Disalin dari MSDN, poin kedua dari indeks non-cluster tidak disebutkan secara jelas dalam jawaban lainnya.
Berkelompok
Tidak bersarang
setiap entri nilai kunci memiliki pointer ke baris data yang berisi nilai kunci.
sumber