it-swarm-id.com

Apa perbedaan antara indeks yang dikelompokkan dan yang tidak dikelompokkan?

Apa perbedaan antara clustered dan non-clustered index?

254
Eric Labashosky

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 bertambah yaitu Id atau Timestamp.

SQL Server biasanya hanya akan menggunakan indeks jika selektivitasnya di atas 95%.

241
Martynnw

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

69
rslite

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.

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

31
Santiago Cepas

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-cluster).
  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.
25
Jojo

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 terurut dan menggunakan Heap data structure sebagai struktur data.

20
Lasitha Yapa

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.

8
Biri

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.

Kekurangan:

Indeks yang dikelompokkan dapat memperlambat sisipan karena tata letak fisik catatan harus dimodifikasi karena catatan dimasukkan jika kunci baru tidak berurutan.

6
Giovanni Galbo

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.

5
Josh

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.

5
Ed Guiness

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 dalam rangka mungkin memerlukan banyak operasi pembacaan tunggal-rekaman yang independen. Karena database mungkin dapat membaca lusinan catatan berturut-turut dalam waktu kurang dari yang diperlukan untuk membaca dua catatan non-berturut-turut, kinerja dapat ditingkatkan jika catatan yang berturut-turut dalam indeks juga disimpan secara berurutan di disk. Menentukan bahwa indeks berkerumun akan menyebabkan database melakukan beberapa upaya (database berbeda berbeda dengan berapa banyak) untuk mengatur hal-hal sehingga kelompok catatan yang berturut-turut dalam indeks akan berturut-turut pada 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. 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 untuk dikelompokkan bersama dalam pasangan, sehingga berpotensi hampir dua kali lipat kecepatan baca berurutan.

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 basis data 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.

5
supercat

Anda mungkin telah melalui bagian teori dari posting di atas:

-Indeks berkerumun seperti yang kita dapat melihat poin langsung untuk merekam yaitu langsung sehingga membutuhkan waktu lebih sedikit untuk pencarian. Selain itu, memori/ruang tambahan tidak akan diperlukan 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 membutuhkan waktu lebih lama untuk diakses. Juga membutuhkan memori/ruang sendiri untuk simpan indeks

 enter image description here

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 data baris dalam tabel disimpan dalam urutan diurutkan adalah Ketika tabel berisi indeks berkerumun. Ketika sebuah tabel memiliki indeks cluster .__, tabel tersebut disebut tabel clustered. Jika tabel Tidak memiliki indeks berkerumun, baris datanya disimpan dalam struktur .__ yang tidak beraturan yang disebut heap.

Nonclustered

  • Indeks nonclustered memiliki struktur terpisah dari baris data. A Indeks yang tidak tercakup mengandung nilai kunci indeks yang tidak tercakup dan
    .__ setiap entri nilai kunci memiliki penunjuk ke baris data yang berisi nilai kunci
  • Pointer dari baris indeks dalam indeks nonclustered ke baris data disebut locator baris. Struktur locator baris bergantung pada Apakah halaman data disimpan dalam heap atau tabel cluster . Untuk heap, locator baris adalah penunjuk ke baris. Untuk tabel .__ berkerumun, pencari baris adalah kunci indeks berkerumun.
0
Deepak Mishra