Apa perbedaan antara indeks yang dikelompokkan dan yang tidak dikelompokkan?

277

Apa perbedaan antara a clustereddan a non-clustered index?

Eric Labashosky
sumber
8
Anda hanya dapat memiliki satu indeks berkerumun per tabel. Tetapi ada banyak perbedaan lain ...
Tom Robinson
5
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.
Josh
1
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.
Biri
2
@biri apa itu urutan "logis"? a Non clustered index menyimpan kunci indeks secara fisik dan menyimpan pointer ke tabel, yaitu kunci indeks yang dikelompokkan.
Stephanie Page
@Stephanie Page: logis dari sudut pandang tabel. Tentu saja indeks non-cluster diurutkan secara fisik dalam indeks itu sendiri.
Biri

Jawaban:

268

Indeks Berkelompok

  • Hanya satu per tabel
  • Lebih cepat dibaca daripada yang tidak berkerumun karena data secara fisik disimpan dalam urutan indeks

Indeks Non Clustered

  • Dapat digunakan berkali-kali per tabel
  • Lebih cepat untuk menyisipkan dan memperbarui operasi daripada indeks berkerumun

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%.

Martynnw
sumber
9
Ada juga pertimbangan penyimpanan. Saat menyisipkan baris ke tabel tanpa indeks berkerumun, baris disimpan kembali ke halaman dan memperbarui baris dapat mengakibatkan baris dipindahkan ke ujung tabel, meninggalkan ruang kosong dan memecah-mecah tabel dan indeks.
Jeremiah Peschka
4
Anda tidak perlu peduli apa itu x. Yang perlu Anda ketahui adalah bahwa untuk aplikasi dengan jutaan pengguna, x akan menjadi signifikan
Pacerier
14
Ini murni dogma. Ini bukan "lebih cepat dibaca karena data disimpan secara berurutan". Ini lebih cepat dibaca karena Anda menghindari indeks membaca DAN MAKA tabel membaca. Lebih cepat melakukan range pemindaian (jika itu bermakna) karena data disimpan secara berurutan. yaitu faktor pengelompokan sempurna.
Stephanie Page
6
Juga gagasan bahwa 95% dari catatan harus unik adalah kekeliruan. Katakanlah Anda memiliki tabel dengan 1.000.000 baris dan Anda mengindeks kolom dengan 500.000 kunci. 0% unik tetapi setiap kunci mengembalikan 2 dari satu juta baris. Indeks ini benar-benar berguna terlepas dari 0% catatan unik.
Stephanie Page
2
"data secara fisik disimpan dalam urutan indeks" apa yang Anda maksud dengan itu? Pada satu tingkat itu sepele benar karena halaman data dan halaman daun indeks adalah satu dan sama - jadi jelas urutan yang satu menggambarkan urutan yang lain. Namun ini belum tentu dalam urutan tertentu seperti urutan kunci indeks stackoverflow.com/questions/1251636/…
Martin Smith
79

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 *)

rslite
sumber
3
'Namun jika Anda hanya memilih data yang tersedia di kolom yang diindeks Anda dapat memperoleh kembali data secara langsung dari data indeks yang digandakan' - ya itu adalah pengecualian penting untuk heuristik indeks yang diutamakan. Saya kira dalam hal ini Anda pada dasarnya memiliki indeks berkerumun, tetapi lebih sedikit data dalam tabel yang Anda tanyakan sehingga berpotensi dapat dibaca lebih cepat dari disk.
satnhak
34

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.

Santiago Cepas
sumber
3
dapatkah Anda menjelaskan lebih lanjut tentang "kita harus selalu memiliki indeks berkerumun di tabel kami"? tanpa uraian, pernyataan itu salah karena kata itu selalu
Pacerier
1
Anda benar Pacerier, seseorang seharusnya tidak menggunakan pernyataan absolut dengan ringan. Meskipun saya tidak tahu satu kasus ketika Anda seharusnya tidak memiliki indeks cluster yang dipilih dengan baik, kasus seperti itu mungkin ada jadi saya telah mengubah jawaban saya ke versi yang lebih umum.
Santiago Cepas
28

Indeks Berkelompok

  1. Hanya ada satu indeks berkerumun untuk tabel.
  2. Biasanya dibuat pada kunci utama.
  3. Node daun indeks berkerumun berisi halaman data.

Indeks Non-Clustered

  1. Hanya ada 249 indeks non-cluster untuk sebuah tabel (hingga versi sql 2005 versi selanjutnya mendukung hingga 999 indeks non-clustered).
  2. Biasanya dibuat pada tombol apa saja.
  3. Node daun dari indeks nonclustered tidak terdiri dari halaman data. Sebagai gantinya, node daun berisi baris indeks.
Jojo
sumber
24

Indeks Berkelompok

  • Hanya satu indeks berkerumun yang bisa ada di tabel
  • Urutkan catatan dan simpan secara fisik sesuai pesanan
  • Pengambilan data lebih cepat daripada indeks non-cluster
  • Tidak perlu ruang ekstra untuk menyimpan struktur logis

Indeks Non Clustered

  • Mungkin ada sejumlah indeks yang tidak berkerumun dalam tabel
  • Jangan memengaruhi tatanan fisik. Buat urutan logis untuk baris data dan gunakan pointer ke file data fisik
  • Penyisipan / pembaruan data lebih cepat dari indeks berkerumun
  • Gunakan ruang ekstra untuk menyimpan struktur logis

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.

Lasitha Yapa
sumber
10

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.

Biri
sumber
9

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.

Giovanni Galbo
sumber
6

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.

Ed Guinness
sumber
6

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.

supercat
sumber
5

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.

Josh
sumber
2

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

masukkan deskripsi gambar di sini

Nandkishor Nangre
sumber
0

// Disalin dari MSDN, poin kedua dari indeks non-cluster tidak disebutkan secara jelas dalam jawaban lainnya.

Berkelompok

  • Indeks yang dikelompokkan mengurutkan dan menyimpan baris data dalam tabel atau tampilan berdasarkan nilai kunci mereka. Ini adalah kolom yang termasuk dalam definisi indeks. Hanya ada satu indeks berkerumun per tabel, karena data baris itu sendiri dapat disimpan hanya dalam satu urutan.
  • Satu-satunya saat baris data dalam tabel disimpan dalam urutan diurutkan adalah ketika tabel berisi indeks berkerumun. Ketika tabel memiliki indeks berkerumun, tabel ini disebut tabel berkerumun. Jika tabel tidak memiliki indeks berkerumun, baris data disimpan dalam struktur tidak beraturan yang disebut heap.

Tidak bersarang

  • Indeks nonclustered memiliki struktur terpisah dari baris data. Indeks nonclustered berisi nilai kunci indeks nonclustered dan
    setiap entri nilai kunci memiliki pointer ke baris data yang berisi nilai kunci.
  • Pointer dari baris indeks dalam indeks nonclustered ke baris data disebut locator baris. Struktur pencari baris tergantung pada apakah halaman data disimpan di heap atau tabel berkerumun. Untuk heap, pelacak baris adalah penunjuk ke baris. Untuk tabel berkerumun, pencari baris adalah kunci indeks berkerumun.
Deepak Mishra
sumber