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 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?
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:
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.
sumber
XML
,VARCHAR(MAX)
atauVARBINARY(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.Dalam penyimpanan berorientasi baris SQL Server, baik indeks clustered dan nonclustered diatur sebagai B tree.
( Sumber Gambar )
Perbedaan utama antara indeks berkerumun dan indeks tidak berkerumun adalah bahwa tingkat daun indeks berkerumun adalah tabel. Ini memiliki dua implikasi.
Indeks non-cluster juga dapat melakukan poin 1 dengan menggunakan
INCLUDE
klausa (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).Dua indeks di atas akan hampir identik. Dengan halaman indeks tingkat atas yang mengandung nilai untuk kolom kunci
A,B
dan halaman tingkat daun berisiA,B,C,D
Kutipan di atas dari buku SQL Server online menyebabkan banyak kebingungan
Menurut pendapat saya itu akan menjadi ungkapan yang lebih baik.
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.
Kemudian periksa tata letak halaman dengan
Hasilnya ada di mana-mana. Baris pertama dalam urutan tombol (dengan nilai 1 - disorot dengan panah di bawah) ada di hampir halaman fisik terakhir.
Fragmentasi dapat dikurangi atau dihapus dengan membangun kembali atau mengatur ulang indeks untuk meningkatkan korelasi antara tatanan logis dan tatanan fisik.
Setelah berlari
Saya mendapat yang berikut
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
INCLUDE
kolom -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
uniquifier
tambahan 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
sumber
SQL Server 2014
. Saya mendapatkan95%
fragmentasi indeks setelah penyisipan awal. Setelahindex rebuild
fragmentasi0%
dan nilai-nilai dipesan. Saya bertanya-tanya, bisakah kita mengatakan ituThe only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0
?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 berlabel001-099
atau sesuatu seperti itu. (Tanda akhir ini di akhir tumpukan sesuai dengan "simpul perantara" dalam indeks.) Akhirnya Anda akan menelusuri ke rak tertentu berlabel005.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.
sumber
Temukan di bawah ini beberapa karakteristik indeks berkerumun dan tidak berkerumun:
Indeks Berkelompok
create Index index_name(col1, col2, col.....)
.Indeks Non-cluster
sumber
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.
sumber
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.
sumber
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
sumber
Biarkan saya menawarkan definisi buku teks tentang "indeks pengelompokan", yang diambil dari 15.6.1 dari Sistem Basis Data: Buku Lengkap :
Untuk memahami definisi ini, mari kita lihat Contoh 15.10 yang disediakan oleh buku teks:
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,
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".
sumber
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.
sumber
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
Untuk informasi lebih lanjut lihat artikel ini .
sumber