Apa yang sebenarnya dimaksud dengan indeks Clustered dan Non Cluster?


1119

Saya memiliki eksposur terbatas ke DB dan hanya menggunakan DB sebagai programmer aplikasi. Saya ingin tahu tentang Clustereddan Non clustered indexes. Saya mencari di Google dan yang saya temukan adalah:

Indeks berkerumun adalah jenis indeks khusus yang menata ulang cara catatan dalam tabel disimpan secara fisik. Oleh karena itu tabel hanya dapat memiliki satu indeks berkerumun. Node daun indeks berkerumun berisi halaman data. Indeks nonclustered adalah jenis indeks khusus di mana urutan logis indeks tidak cocok dengan urutan fisik yang disimpan dari baris pada disk. Node daun dari indeks nonclustered tidak terdiri dari halaman data. Sebagai gantinya, node daun berisi baris indeks.

Apa yang saya temukan di SO adalah Apa perbedaan antara indeks yang berkerumun dan yang tidak berkerumun? .

Adakah yang bisa menjelaskan hal ini dalam bahasa Inggris?

Jawaban:


1118

Dengan indeks berkerumun baris disimpan secara fisik pada disk dalam urutan yang sama dengan indeks. Oleh karena itu, hanya ada satu indeks berkerumun.

Dengan indeks non-cluster ada daftar kedua yang memiliki pointer ke baris fisik. Anda dapat memiliki banyak indeks yang tidak berkerumun, meskipun setiap indeks baru akan menambah waktu yang diperlukan untuk menulis catatan baru.

Biasanya lebih cepat membaca dari indeks berkerumun jika Anda ingin mendapatkan kembali semua kolom. Anda tidak harus pergi dulu ke indeks dan kemudian ke tabel.

Menulis ke tabel dengan indeks berkerumun bisa lebih lambat, jika ada kebutuhan untuk mengatur ulang data.


43
Anda harus mengklarifikasi apa yang Anda maksud dengan "secara fisik".
Spencer Ruport

142
secara fisik seperti dalam bit aktual yang disimpan pada disk
Peter

17
Lihat msdn "Ketika Anda membuat batasan PRIMARY KEY, indeks berkerumun unik pada kolom atau kolom secara otomatis dibuat jika indeks berkerumun di tabel tidak ada", yang berarti tidak perlu harus menjadi kolom yang sama.
Ming

46
@Pete bukan itu masalahnya. SQL Server tentu saja tidak menjamin bahwa semua file data diletakkan dalam area fisik disk yang berdekatan dan tidak ada fragmentasi sistem file. Bahkan tidak benar bahwa indeks berkerumun dalam file data. Sejauh mana ini tidak terjadi adalah tingkat fragmentasi logis.
Martin Smith

42
Hanya komentar cepat untuk mendukung poin Martin Smith - indeks berkerumun tidak menjamin penyimpanan berurutan pada disk. Mengelola dengan tepat di mana data ditempatkan pada disk adalah tugas OS, bukan DBMS. Tapi itu menunjukkan bahwa barang dipesan secara umum sesuai dengan kunci pengelompokan. Apa artinya ini adalah bahwa jika DB tumbuh sebesar 10GB, misalnya, OS dapat memutuskan untuk menempatkan 10GB dalam potongan 5x2GB pada bagian disk yang berbeda. Tabel berkerumun yang mencakup 10GB akan disimpan secara berurutan pada setiap potongan 2GB, potongan 2GB tersebut MUNGKIN TIDAK bisa berurutan.
Gumpalan

601

Indeks berkerumun berarti Anda memberitahu database untuk menyimpan nilai dekat sebenarnya dekat satu sama lain pada disk. Ini memiliki manfaat pemindaian / pengambilan cepat dari catatan yang masuk ke beberapa rentang nilai indeks yang dikelompokkan.

Misalnya, Anda memiliki dua tabel, Pelanggan dan Pesanan:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

Jika Anda ingin cepat mengambil semua pesanan dari satu pelanggan tertentu, Anda mungkin ingin membuat indeks berkerumun di kolom "CustomerID" dari tabel Pesanan. Dengan cara ini catatan dengan CustomerID yang sama akan disimpan secara fisik berdekatan satu sama lain pada disk (berkerumun) yang mempercepat pengambilan mereka.

PS Indeks pada CustomerID jelas tidak akan unik, jadi Anda perlu menambahkan bidang kedua untuk "menyatukan" indeks atau membiarkan database menangani itu untuk Anda tetapi itu adalah cerita lain.

Mengenai beberapa indeks. Anda hanya dapat memiliki satu indeks berkerumun per tabel karena ini menentukan bagaimana data diatur secara fisik. Jika Anda menginginkan analogi, bayangkan sebuah ruangan besar dengan banyak meja di dalamnya. Anda bisa meletakkan tabel-tabel ini untuk membentuk beberapa baris atau menarik semuanya bersama-sama untuk membentuk tabel konferensi besar, tetapi tidak keduanya sekaligus. Sebuah tabel dapat memiliki indeks lain, mereka kemudian akan menunjuk ke entri dalam indeks berkerumun yang pada gilirannya pada akhirnya akan mengatakan di mana menemukan data aktual.


4
Itu dikatakan CI harus selalu digunakan untuk PK
mko

4
Jadi dengan indeks berkerumun apakah itu catatan dalam indeks atau tabel yang disimpan berdekatan?
Caltor

5
@ Caltor Tabelnya . Indeks dipesan berdasarkan definisi. Sebagai contoh, sebuah btree akan dipesan sehingga seseorang dapat dengan mudah melakukan aritmatika alamat untuk mencari. Gagasan cluster adalah untuk memenuhi tabel untuk kinerja indeks tertentu. Agar lebih jelas, catatan tabel akan disusun ulang agar sesuai dengan urutan indeks awalnya .
FLGMwt

9
@ Caltor Tidak sama sekali! Memang, dokumentasi dan namanya sendiri cukup menyesatkan. Memiliki "indeks berkerumun" benar-benar tidak ada hubungannya dengan indeks. Secara konseptual, apa yang sebenarnya Anda miliki adalah "sebuah tabel yang dikelompokkan pada indeks x ".
FLGMwt

3
@ JohnOrtizOrdoñez: Tentu, Anda dapat menggunakan hampir semua yang disimpan dalam-baris, sehingga tidak ada XML, VARCHAR(MAX)atau VARBINARY(MAX). Perhatikan bahwa biasanya masuk akal untuk mengelompokkan pada bidang tanggal terlebih dahulu , karena indeks berkerumun paling efisien untuk pemindaian kisaran, yang paling umum pada tipe tanggal. YMMV.

317

Dalam penyimpanan berorientasi baris SQL Server, baik indeks clustered dan nonclustered diatur sebagai B tree.

masukkan deskripsi gambar di sini

( Sumber Gambar )

Perbedaan utama antara indeks berkerumun dan indeks tidak berkerumun adalah bahwa tingkat daun indeks berkerumun adalah tabel. Ini memiliki dua implikasi.

  1. Baris pada halaman daun indeks berkerumun selalu berisi sesuatu untuk setiap kolom (tidak jarang) dalam tabel (baik nilai, atau penunjuk ke nilai aktual).
  2. Indeks berkerumun adalah salinan utama tabel.

Indeks non-cluster juga dapat melakukan poin 1 dengan menggunakan INCLUDEklausa (Sejak SQL Server 2005) untuk secara eksplisit menyertakan semua kolom non-kunci tetapi mereka adalah representasi sekunder dan selalu ada salinan data lain di sekitar (tabel itu sendiri).

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

Dua indeks di atas akan hampir identik. Dengan halaman indeks tingkat atas yang mengandung nilai untuk kolom kunci A,Bdan halaman tingkat daun berisiA,B,C,D

Hanya ada satu indeks berkerumun per tabel, karena baris data itu sendiri dapat diurutkan hanya dalam satu urutan.

Kutipan di atas dari buku SQL Server online menyebabkan banyak kebingungan

Menurut pendapat saya itu akan menjadi ungkapan yang lebih baik.

Hanya ada satu indeks berkerumun per tabel, karena baris tingkat daun dari indeks berkerumun adalah baris tabel.

Kutipan buku online tidak salah, tetapi Anda harus jelas bahwa "pengurutan" dari kedua indeks non-clustered dan logis adalah logis bukan fisik. Jika Anda membaca halaman pada tingkat daun dengan mengikuti daftar yang ditautkan dan membaca baris pada halaman dalam urutan array slot maka Anda akan membaca baris indeks dalam urutan diurutkan tetapi secara fisik halaman mungkin tidak diurutkan. Kepercayaan umum bahwa dengan indeks berkerumun baris selalu disimpan secara fisik pada disk dalam urutan yang sama dengan kunci indeks salah.

Ini akan menjadi implementasi yang tidak masuk akal. Sebagai contoh jika sebuah baris dimasukkan ke tengah tabel 4GB SQL Server tidak harus menyalin 2GB data dalam file untuk memberikan ruang bagi baris yang baru dimasukkan.

Alih-alih terjadi pemisahan halaman. Setiap halaman pada tingkat daun dari indeks berkerumun dan tidak berkerumun memiliki alamat ( File:Page) dari halaman berikutnya dan sebelumnya dalam urutan kunci logis. Halaman-halaman ini tidak harus bersebelahan atau berurutan.

misalnya rantai halaman yang ditautkan mungkin 1:2000 <-> 1:157 <-> 1:7053

Ketika terjadi pemisahan halaman, halaman baru dialokasikan dari mana saja di filegroup (baik dari tingkat campuran, untuk tabel kecil, atau tingkat seragam yang tidak kosong milik objek itu atau tingkat seragam yang baru dialokasikan). Ini bahkan mungkin tidak berada di file yang sama jika grup file berisi lebih dari satu.

Tingkat perbedaan urutan dan kedekatan logis dari versi fisik ideal adalah tingkat fragmentasi logis.

Dalam database yang baru dibuat dengan satu file saya menjalankan yang berikut ini.

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

Kemudian periksa tata letak halaman dengan

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

Hasilnya ada di mana-mana. Baris pertama dalam urutan tombol (dengan nilai 1 - disorot dengan panah di bawah) ada di hampir halaman fisik terakhir.

masukkan deskripsi gambar di sini

Fragmentasi dapat dikurangi atau dihapus dengan membangun kembali atau mengatur ulang indeks untuk meningkatkan korelasi antara tatanan logis dan tatanan fisik.

Setelah berlari

ALTER INDEX ix ON T REBUILD;

Saya mendapat yang berikut

masukkan deskripsi gambar di sini

Jika tabel tidak memiliki indeks berkerumun itu disebut heap.

Indeks non-cluster dapat dibangun di atas heap atau indeks cluster. Mereka selalu berisi pelacak baris kembali ke tabel dasar. Dalam kasus tumpukan ini adalah pengidentifikasi baris fisik (rid) dan terdiri dari tiga komponen (File: Halaman: Slot). Dalam kasus indeks Clustered locator baris adalah logis (kunci indeks berkerumun).

Untuk kasus yang terakhir jika indeks non-cluster sudah secara alami menyertakan kolom kunci CI baik sebagai kolom kunci NCI atau INCLUDEkolom -d maka tidak ada yang ditambahkan. Kalau tidak, kolom kunci CI yang hilang diam-diam ditambahkan ke NCI.

SQL Server selalu memastikan bahwa kolom kunci unik untuk kedua jenis indeks. Mekanisme di mana ini diberlakukan untuk indeks tidak dinyatakan sebagai unik berbeda antara kedua jenis indeks.

Indeks yang dikelompokkan mendapat uniquifiertambahan untuk setiap baris dengan nilai kunci yang menduplikasi baris yang ada. Ini hanya bilangan bulat naik.

Untuk indeks yang tidak berkerumun yang tidak dideklarasikan sebagai SQL Server unik, diam-diam menambahkan pencari baris ke kunci indeks yang tidak dikelompokkan. Ini berlaku untuk semua baris, bukan hanya yang sebenarnya duplikat.

Nomenklatur clustered vs non clustered juga digunakan untuk indeks toko kolom. Makalah Peningkatan ke Toko Kolom SQL Server menyatakan

Meskipun kolom menyimpan data tidak benar-benar "berkerumun" pada kunci apa pun, kami memutuskan untuk mempertahankan konvensi SQL Server tradisional merujuk ke indeks primer sebagai indeks berkerumun.


8
@ brainstorm ya saya tahu itu. Mungkin itu karena frasa pada halaman MSDN ini tetapi untuk melihat bahwa frasa di sana agak menyesatkan, Anda hanya perlu melihat topik fragmentasi
Martin Smith

12
@brainstorm: Sungguh menakjubkan bagaimana beberapa pernyataan palsu diulang sebagai Injil. Berkelompok menunjukkan bahwa, setidaknya dari perspektif membaca berurutan, itu akan "diinginkan" untuk memiliki baris disimpan secara fisik pada disk dalam urutan yang sama dengan indeks , tetapi itu jauh dari mengatakan bahwa itu akan menyebabkan mereka benar-benar disimpan sedemikian rupa.
supercat

5
@ MartinSmith Saya telah mereproduksi dan mengonfirmasi hasil pengujian Anda SQL Server 2014. Saya mendapatkan 95%fragmentasi indeks setelah penyisipan awal. Setelah index rebuildfragmentasi 0%dan nilai-nilai dipesan. Saya bertanya-tanya, bisakah kita mengatakan itu The only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0?
Gotqn

8
@ MartinSmith Sekarang, Pak, ini jawabannya. Saya ingin melihatnya di atas daftar tanggapan tetapi ketika SO berjalan, "cepat dan sederhana" mendapatkan upvoting.
vaitrafra

5
@Manachi jawaban ini diberikan 5 tahun setelah pertanyaan awal diajukan. Tujuannya adalah untuk memperbaiki beberapa aspek yang menyesatkan dari jawaban-jawaban itu. Tingkah OP (yang sekarang berusia 8 tahun) bukan urusan saya. Pembaca lain mungkin menghargai pandangan yang lebih rendah.
Martin Smith

150

Saya menyadari ini adalah pertanyaan yang sangat lama, tetapi saya pikir saya akan menawarkan analogi untuk membantu menggambarkan jawaban yang baik di atas.

INDEKS BERKELAS

Jika Anda berjalan ke perpustakaan umum, Anda akan menemukan bahwa buku-buku tersebut semuanya diatur dalam urutan tertentu (kemungkinan besar Dewey Decimal System, atau DDS). Ini sesuai dengan "indeks berkerumun" dari buku-buku. Jika DDS # untuk buku yang Anda inginkan adalah 005.7565 F736s, Anda akan mulai dengan mencari deretan rak buku yang berlabel 001-099atau sesuatu seperti itu. (Tanda akhir ini di akhir tumpukan sesuai dengan "simpul perantara" dalam indeks.) Akhirnya Anda akan menelusuri ke rak tertentu berlabel 005.7450 - 005.7600, maka Anda akan memindai sampai Anda menemukan buku dengan DDS # yang ditentukan, dan pada saat itu Anda telah menemukan buku Anda.

INDEKS TIDAK BERKELAS

Tetapi jika Anda tidak datang ke perpustakaan dengan DDS # buku Anda dihafal, maka Anda akan membutuhkan indeks kedua untuk membantu Anda. Di masa lalu Anda akan menemukan di depan perpustakaan biro indah laci yang dikenal sebagai "Katalog Kartu". Di dalamnya ada ribuan kartu 3x5 - satu untuk setiap buku, diurutkan dalam urutan abjad (menurut judul, mungkin). Ini sesuai dengan "indeks non-clustered" . Katalog kartu ini disusun dalam struktur hierarkis, sehingga setiap laci akan diberi label dengan rentang kartu yang dikandungnya ( Ka - Kl, misalnya; yaitu, "simpul perantara"). Sekali lagi, Anda akan menelusuri sampai Anda menemukan buku Anda, tetapi dalam kasus ini , setelah Anda menemukannya (yaitu, "leaf leaf"), Anda tidak memiliki buku itu sendiri,nomor indeks (DDS #) yang dengannya Anda dapat menemukan buku yang sebenarnya dalam indeks berkerumun.

Tentu saja, tidak ada yang akan menghentikan pustakawan memfotokopi semua kartu dan mengurutkannya dalam urutan yang berbeda dalam katalog kartu terpisah. (Biasanya setidaknya ada dua katalog seperti itu: satu diurutkan berdasarkan nama penulis, dan satu lagi menurut judul.) Pada prinsipnya, Anda dapat memiliki sebanyak mungkin dari indeks "non-clustered" ini seperti yang Anda inginkan.


2
Saya bisa, mungkin, memperluas analogi ini untuk menggambarkan kolom "Termasuk" , yang dapat digunakan dengan Indeks Non-Clustered: Orang dapat membayangkan kartu dalam katalog kartu termasuk lebih dari sekedar satu buku, tetapi daftar semua yang diterbitkan versi buku, disusun secara numerik berdasarkan tanggal publikasi. Sama seperti di "kolom yang disertakan" informasi ini disimpan hanya pada tingkat daun (sehingga mengurangi jumlah kartu yang harus dibuat pustakawan).
kmote

1
analogi yang hebat - benar-benar membantu memvisualisasikannya!
Denis

71

Temukan di bawah ini beberapa karakteristik indeks berkerumun dan tidak berkerumun:

Indeks Berkelompok

  1. Indeks berkerumun adalah indeks yang secara unik mengidentifikasi baris dalam tabel SQL.
  2. Setiap tabel dapat memiliki tepat satu indeks berkerumun.
  3. Anda dapat membuat indeks berkerumun yang mencakup lebih dari satu kolom. Sebagai contoh: create Index index_name(col1, col2, col.....).
  4. Secara default, kolom dengan kunci utama sudah memiliki indeks berkerumun.

Indeks Non-cluster

  1. Indeks non-cluster seperti indeks sederhana. Mereka hanya digunakan untuk pengambilan data yang cepat. Tidak yakin memiliki data unik.

34
Satu sedikit koreksi ke Poin 1. Indeks berkerumun tidak secara unik mengidentifikasi baris dalam tabel SQL. Itulah fungsi KUNCI UTAMA
Nigel

4
@Nigel, KUNCI UTAMA atau INDEKS UNIK?
anar khalilov

jawaban praktis dan langsung, terima kasih @Anirudh Sood
Oscar Romero

50

Aturan praktis yang sangat sederhana dan non-teknis adalah bahwa indeks berkerumun biasanya digunakan untuk kunci utama Anda (atau, setidaknya, kolom unik) dan bahwa non-berkerumun digunakan untuk situasi lain (mungkin kunci asing) . Memang, SQL Server secara default akan membuat indeks berkerumun di kolom kunci utama Anda. Seperti yang telah Anda pelajari, indeks berkerumun berkaitan dengan cara data diurutkan secara fisik pada disk, yang berarti itu adalah pilihan serba baik untuk sebagian besar situasi.


47

Indeks Berkelompok

Indeks berkerumun menentukan urutan fisik DATA dalam tabel. Untuk alasan ini tabel hanya memiliki 1 indeks berkerumun.

  • " Kamus " Tidak perlu Indeks lain, sudah Indeks sesuai kata-kata

Indeks Tidak Tertutup

Indeks yang tidak berkerumun dianalogikan dengan indeks dalam Buku. Data disimpan di satu tempat. Indeks menyimpan di tempat lain dan indeks memiliki pointer ke lokasi penyimpanan data. Untuk alasan ini tabel memiliki lebih dari 1 indeks Nonclustered.

  • " Buku Kimia " pada menatap ada indeks terpisah untuk menunjuk lokasi Bab dan Pada "AKHIR" ada Indeks lain yang menunjuk lokasi KATA umum

6

Indeks 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 baris data itu sendiri dapat diurutkan 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 tersebut disebut tabel berkerumun. Jika tabel tidak memiliki indeks berkerumun, baris datanya 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 baris locator. Struktur pencari baris tergantung pada apakah halaman data disimpan di heap atau tabel berkerumun. Untuk heap, pencari baris adalah penunjuk ke baris. Untuk tabel berkerumun, pencari baris adalah kunci indeks berkerumun.

Anda bisa menambahkan kolom bukan kunci ke tingkat daun indeks yang tidak dikelompokkan untuk memotong batas kunci indeks yang ada, dan menjalankan kueri yang sepenuhnya tertutup, diindeks,. Untuk informasi lebih lanjut, lihat Membuat Indeks dengan Kolom yang Disertakan. Untuk detail tentang batas kunci indeks lihat Spesifikasi Kapasitas Maksimum untuk SQL Server.

Referensi: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-description


4

Biarkan saya menawarkan definisi buku teks tentang "indeks pengelompokan", yang diambil dari 15.6.1 dari Sistem Basis Data: Buku Lengkap :

Kita juga dapat berbicara tentang indeks pengelompokan , yang merupakan indeks pada suatu atribut atau atribut sehingga semua tupel dengan nilai tetap untuk kunci pencarian indeks ini muncul pada kira-kira beberapa blok yang dapat menahannya.

Untuk memahami definisi ini, mari kita lihat Contoh 15.10 yang disediakan oleh buku teks:

Suatu relasi R(a,b)yang diurutkan berdasarkan atribut adan disimpan dalam urutan itu, dikemas ke dalam blok, pastinya adalah clusterd. Indeks aktif aadalah indeks pengelompokan, karena untuk nilai- aa1 yang diberikan , semua tupel dengan nilai itu untuk aberturut-turut. Dengan demikian mereka tampak dikemas ke dalam blok, dieksekusi mungkin untuk blok pertama dan terakhir yang mengandung- anilai a1, seperti yang disarankan pada Gambar.15.14. Namun, indeks pada b tidak mungkin untuk mengelompok, karena tupel dengan nilai tetap bakan tersebar di seluruh file kecuali nilai adan bberkorelasi sangat erat.

Gambar 15.14

Perhatikan bahwa definisi tidak menegakkan blok data harus berdekatan pada disk; itu hanya mengatakan tupel dengan kunci pencarian dimasukkan ke blok data sesedikit mungkin.

Konsep terkait adalah hubungan berkerumun . Suatu relasi "berkerumun" jika tupelnya dikemas menjadi kira-kira beberapa blok yang mungkin bisa menampung tupel tersebut. Dengan kata lain, dari perspektif blok disk, jika berisi tupel dari relasi yang berbeda, maka relasi tersebut tidak dapat dikelompokkan (yaitu, ada cara yang lebih padat untuk menyimpan relasi tersebut dengan menukar tupel relasi itu dari blok disk lain dengan tuples yang bukan milik relasi di blok disk saat ini). Jelas, R(a,b)dalam contoh di atas dikelompokkan.

Untuk menghubungkan dua konsep bersama, relasi berkerumun dapat memiliki indeks pengelompokan dan indeks nonclustering. Namun, untuk hubungan non-cluster, indeks clustering tidak mungkin kecuali indeks dibangun di atas kunci utama dari relasi.

"Cluster" sebagai sebuah kata yang dikirim ke semua level abstraksi di sisi penyimpanan basis data (tiga level abstraksi: tupel, blok, file). Sebuah konsep yang disebut " file berkerumun ", yang menggambarkan apakah file (abstraksi untuk sekelompok blok (satu atau lebih blok disk)) berisi tupel dari satu relasi atau relasi yang berbeda. Itu tidak berhubungan dengan konsep indeks pengelompokan karena pada tingkat file.

Namun, beberapa bahan ajar suka mendefinisikan indeks pengelompokan berdasarkan pada definisi file yang dikelompokkan. Kedua jenis definisi itu sama pada tingkat hubungan berkerumun, tidak peduli apakah mereka mendefinisikan hubungan berkerumun dalam hal blok data atau file. Dari tautan di paragraf ini,

Indeks atribut (A) pada file adalah indeks pengelompokan ketika: Semua tupel dengan nilai atribut A = a disimpan secara berurutan (= berturut-turut) dalam file data

Menyimpan tupel secara berurutan sama dengan mengatakan "tupel dikemas menjadi kira-kira beberapa blok yang mungkin menampung tupel-tupel itu" (dengan perbedaan kecil pada satu pembicaraan tentang file, yang lain berbicara tentang disk). Itu karena menyimpan tuple secara berurutan adalah cara untuk mencapai "dikemas menjadi kira-kira beberapa blok yang mungkin dapat menahan tupel-tupel itu".


3

Clustered Index: Batasan Kunci Utama membuat Indeks berkerumun secara otomatis jika tidak ada Indeks berkerumun di atas meja. Data aktual indeks berkerumun dapat disimpan di tingkat daun Indeks.

Non Clustered Index: Data aktual dari indeks non clustered tidak langsung ditemukan pada leaf leaf, melainkan harus mengambil langkah tambahan untuk menemukannya karena hanya memiliki nilai pelacak baris yang menunjuk ke data aktual. Indeks Non-cluster tidak dapat diurutkan sebagai indeks cluster. Mungkin ada beberapa indeks non clustered per tabel, sebenarnya itu tergantung pada versi sql server yang kami gunakan. Pada dasarnya Sql server 2005 memungkinkan 249 Non Clustered Indexes dan untuk versi di atas seperti 2008, 2016 memungkinkan 999 Non Clustered Indexes per tabel.


2

Clustered Index - Indeks berkerumun mendefinisikan urutan di mana data secara fisik disimpan dalam tabel. Tabel data dapat diurutkan hanya dengan cara, karena itu, hanya ada satu indeks berkerumun per tabel Dalam SQL Server, batasan kunci utama secara otomatis membuat indeks berkerumun pada kolom tertentu.

Indeks Non-Clustered- Indeks non-cluster tidak mengurutkan data fisik di dalam tabel. Bahkan, indeks non-clustered disimpan di satu tempat dan data tabel disimpan di tempat lain. Ini mirip dengan buku teks di mana konten buku terletak di satu tempat dan indeks berada di tempat lain. Ini memungkinkan lebih dari satu indeks non-clustered per tabel. Penting untuk disebutkan di sini bahwa di dalam tabel data akan diurutkan berdasarkan indeks clustered. Namun, di dalam data indeks non-cluster disimpan dalam urutan yang ditentukan. Indeks berisi nilai kolom tempat indeks dibuat dan alamat catatan yang menjadi milik nilai kolom. Ketika kueri dikeluarkan terhadap kolom tempat indeks dibuat, basis data pertama-tama akan pergi ke indeks dan mencari alamat baris yang sesuai dalam tabel. Kemudian akan pergi ke alamat baris itu dan mengambil nilai kolom lainnya. Karena langkah tambahan ini indeks non-cluster lebih lambat daripada indeks cluster

Perbedaan antara indeks clustered dan Non-clustered

  1. Hanya ada satu indeks berkerumun per tabel. Namun, Anda bisa membuat beberapa indeks non-cluster di satu tabel.
  2. Indeks yang dikelompokkan hanya mengurutkan tabel. Karena itu, mereka tidak mengkonsumsi penyimpanan ekstra. Indeks non-cluster disimpan di tempat yang terpisah dari tabel aktual yang mengklaim lebih banyak ruang penyimpanan.
  3. Indeks cluster lebih cepat daripada indeks non-cluster karena mereka tidak melibatkan langkah pencarian tambahan.

Untuk informasi lebih lanjut lihat artikel ini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.