it-swarm.asia

Apa yang sebenarnya dimaksud dengan indeks Clustered dan Non Cluster?

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

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

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

Adakah yang bisa menjelaskan ini dalam bahasa Inggris?

897
P.K

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

902
Shiraz Bhaiji

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

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" pada 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.

P.S. 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 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 akhirnya akan mengatakan di mana menemukan data aktual.

553
user151323

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

enter image description here

( Sumber Gambar )

Perbedaan utama antara indeks berkerumun dan indeks tidak berkerumun adalah bahwa tingkat daun indeks berkerumun is 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.

Non-clustered indexes juga dapat melakukan poin 1 dengan menggunakan klausa INCLUDE (Sejak SQL Server 2005) untuk secara eksplisit menyertakan semua kolom bukan 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 level atas yang mengandung nilai untuk kolom kunci A,B dan halaman level daun yang mengandung A,B,C,D

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

Kutipan di atas dari buku-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 are baris tabel. 

Kutipan buku online tidak salah tetapi Anda harus jelas bahwa "pengurutan" dari kedua indeks yang tidak berkerumun dan berkerumun 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 indeks kunci adalah salah. 

Ini akan menjadi implementasi yang absurd. 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 perlu bersebelahan atau berurutan.

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

Ketika terjadi perpecahan halaman, halaman baru dialokasikan dari mana saja di filegroup (baik dari tingkat campuran, untuk tabel kecil, atau tingkat seragam 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 tatanan logis dan kedekatan 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.

enter image description here

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

enter image description here

Jika tabel tidak memiliki indeks berkerumun itu disebut heap.

Indeks non clustered dapat dibangun di atas heap atau index clustered. 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 kolom INCLUDE- 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 mendapatkan uniquifier yang ditambahkan 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 data penyimpanan kolom tidak benar-benar "berkerumun" pada sembarang tombol, kami memutuskan untuk mempertahankan konvensi tradisional SQL Server merujuk ke indeks utama sebagai indeks berkerumun.

253
Martin Smith

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 semua buku disusun 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 baris rak buku yang berlabel 001-099 atau 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 (berdasarkan 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; mis., "Simpul perantara"). Sekali lagi, Anda akan menelusuri sampai Anda menemukan buku Anda, tetapi dalam ini kasus, setelah Anda menemukannya (yaitu, "leaf leaf"), Anda tidak memiliki buku itu sendiri, tetapi hanya sebuah kartu dengan index number (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 berdasarkan judul.) Pada prinsipnya, Anda dapat memiliki sebanyak mungkin dari indeks "non-clustered" yang Anda inginkan. 

103
kmote

Aturan praktis yang sangat sederhana, 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 akan Anda pelajari, indeks berkerumun berkaitan dengan cara data diurutkan secara fisik pada disk, yang berarti itu adalah pilihan serba baik untuk sebagian besar situasi.

45
Dan Diplo

Indeks Berkelompok

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

seperti "kamus" Tidak perlu Indeks lain, sudah Index sesuai kata-kata 

Indeks Tidak Tertutup

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

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

13
abdul rehman kk

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 data baris 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 sebuah tabel memiliki indeks berkerumun, tabel tersebut disebut tabel berkerumun. Jika tabel tidak memiliki indeks berkerumun, baris data disimpan dalam struktur tidak beraturan yang disebut heap.

Nonclustered

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, locator baris adalah penunjuk ke baris. Untuk tabel berkerumun, locator 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

3
marvelTracker

Indeks Clustered: Primary Key constraint membuat Indeks berkerumun secara otomatis jika tidak ada Indeks berkerumun di atas meja. Data aktual indeks berkerumun dapat disimpan pada tingkat daun Indeks. 

Non Clustered Index: Data aktual dari indeks non clustered tidak secara langsung ditemukan pada leaf leaf, melainkan harus mengambil langkah tambahan untuk menemukannya karena hanya memiliki nilai pelacak baris yang menunjuk pada data aktual ..__ Indeks .Non tidak berkerumun tidak dapat diurutkan sebagai indeks berkerumun. 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.

0
Abhishek Duppati