Sebenarnya, Anda tidak perlu Indeks Berkelompok atau Kunci Utama untuk dibuat, karena Indeks Unik dan Indeks Non-Unik dapat menangani pekerjaan. SQL Server telah mendukung Indeks Clustered sejak setidaknya versi 1.1, tetapi Kunci Primer hanyalah sebuah "konsep" yang diprogram oleh pemrogram dengan mendefinisikan indeks yang unik.
Tapi sepertinya Primary Key dan Clustered Indexes adalah konsep yang berharga di sebagian besar basis data.
Mari kita lihat dokumentasi SQL Server untuk melihat deskripsi sebagian dari beberapa opsi pengindeksan seperti yang ditunjukkan di bawah ini.
Indeks Clustered: https://msdn.microsoft.com/en-us/library/ms190457.aspx
- 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
Kunci Utama: https://msdn.microsoft.com/en-us/library/ms190457.aspx
Sebuah tabel hanya dapat berisi satu kendala PRIMARY KEY.
Semua kolom yang didefinisikan dalam batasan PRIMARY KEY harus didefinisikan sebagai NOT NULL.
Kunci Utama dapat dibuat sebagai Indeks Clustered (default jika tidak ada Indeks Clustered) atau Indeks Non-Clustered.
Indeks Unik: https://msdn.microsoft.com/en-us/library/ms187019.aspx
Saat Anda membuat batasan UNIQUE, indeks nonclustered unik dibuat untuk menegakkan batasan UNIQUE secara default.
Anda bisa menentukan Indeks Clustered UNIK jika Indeks Clustered belum ada untuk tabel.
Ini berarti bahwa pertanyaan Anda tentang Indeks Berkelompok dan Kunci Utama sebenarnya tentang beberapa masalah berikut. Harap dicatat bahwa tidak setiap tabel mendapat manfaat dari paket pengindeksan yang sama.
Kapan saya akan mendapat manfaat dari Kunci Utama yang terpisah dari Indeks Berkelompok?
Mungkin ketika Indeks Clustered adalah Lebar (misalnya, 5 kolom informasi tekstual, tetapi Kunci Utama kecil (INT atau BIGINT), seperti yang tampaknya Anda gambarkan.
- Indeks Clustered luas akan memungkinkan Anda untuk dengan cepat memilih baris dari indeks untuk subset kueri yang memberikan jawaban serial dari Indeks Clustered (juga dikenal sebagai Tabel ). Misalnya, Indeks Clustered 5-kolom akan mendukung pemindaian kolom C1, C2, C3, C4, C5 atau C1, C2, C3, C4 dan seterusnya ke C1.
- Catatan: Jika barisnya besar, ini mungkin memberi Anda beberapa keuntungan kecepatan dalam memilih rangkaian serial baris, terutama jika kolom lain dalam tabel secara teratur termasuk dalam set hasil.
- Dalam hal ini Anda dapat menggunakan Kunci Utama untuk integritas referensial untuk memasok nilai yang dibutuhkan sebagai Kunci Asing untuk membatasi baris di tabel lain. PK kecil dan dengan demikian FK adalah hit kecil pada ukuran tabel yang direferensikan.
- Namun, perhatikan bahwa indeks apa pun yang dibuat pada tabel yang memiliki Indeks Clustered akan mencakup semua kolom cluster di indeks lain yang Anda buat di tabel ini. Indeks Clustered luas akan memperluas ukuran semua indeks non-cluster di tabel itu.
Haruskah Anda membuat Kunci Utama saja menjadi Indeks Berkelompok?
Jika Anda memiliki Kunci Utama kecil (INT atau BIGINT) dan itu adalah Indeks Clustered, overhead kolom cluster relatif kecil. Meskipun Kunci Utama Clustered dalam kasus ini juga akan ada di setiap indeks pada tabel ini, itu adalah harga yang lebih kecil untuk dibayar daripada Wide Cluster yang dibahas di atas.
Indeks Klaster Kunci Utama ini biasanya tidak secara langsung menawarkan jalur mudah untuk memilih banyak baris secara serial.
Sekarang Anda telah membuat Kunci Utama Clustered, bagaimana dengan kolom-kolom lain yang pernah Anda rencanakan untuk dimasukkan dalam Indeks Clustered ?
Buat indeks Unik (atau Non-Unik) sesuai kebutuhan untuk mengindeks kriteria pencarian luas kolom C1, C2, C3, C4, C5. Nilai-nilai dalam Indeks "Imitasi Berkelompok" ini dapat berfungsi sebagai jalur pencarian yang lebih cepat untuk 5 kolom tersebut. Jika ada satu atau dua kolom yang tidak diindeks yang secara teratur dipilih juga, mereka dapat dimasukkan dalam indeks dengan INCLUDE (Doctor_Name, Diagnosis_Synopsis)
.
Meskipun saya menemukan Indeks Clustered sederhana dan Kunci Utama berguna, ada beberapa alasan bagus untuk memikirkan apakah akan menggunakannya dalam tabel atau dalam database.
Apakah Anda memerlukan Indeks Clustered sama sekali?
Jika Anda membuat indeks (Indeks Unik dan Indeks Non-Unik) dan mendefinisikan Kunci Utama tanpa overhead menjadi Indeks Clustered, Anda mungkin menemukan bahwa indeks yang lebih sempit menyediakan apa yang Anda butuhkan untuk pertanyaan Anda.
Ada beberapa perilaku bermanfaat dalam Indeks Berkelompok dan Kunci Utama, tetapi ingat bahwa sebenarnya indekslah yang paling penting. Rancang strategi pengindeksan untuk memperhitungkan realitas aplikasi Anda. Mungkin OneBigTable
kebutuhan untuk memiliki strategi pengindeksan yang berbeda dari apa yang Anda gunakan untuk sebagian besar tabel.
Tanpa Indeks Clustered data Anda akan disimpan sebagai tumpukan dengan Row Identifier (RID) yang sama sekali bukan mekanisme pencarian yang baik. Tetapi, seperti yang disebutkan sebelumnya, Anda dapat membuat indeks yang unik dan tidak unik untuk menangani pertanyaan Anda.
Yang sekarang membuat Anda mempertimbangkan Heaps:
Tumpukan dan Indeks: https://msdn.microsoft.com/en-us/library/hh213609.aspx
- Ketika sebuah tabel disimpan sebagai tumpukan, setiap baris diidentifikasi dengan merujuk ke pengidentifikasi baris (RID) yang terdiri dari nomor file, nomor halaman data, dan slot pada halaman. Id baris adalah struktur kecil dan efisien. (Tapi itu bukan indeks .)
- Kadang-kadang arsitek data menggunakan tumpukan ketika data selalu diakses melalui indeks nonclustered dan RID lebih kecil dari kunci indeks berkerumun .
Tetapi jika Anda juga memiliki beberapa 'hot spot' dalam kumpulan data besar, Anda juga dapat melihat jenis indeks lain:
Indeks yang Difilter: https://msdn.microsoft.com/en-us/library/cc280372.aspx
Indeks berfilter yang dirancang dengan baik meningkatkan kinerja kueri dan kualitas rencana eksekusi karena lebih kecil dari indeks tabel tidak tercakup penuh dan telah memfilter statistik. Statistik yang difilter lebih akurat daripada statistik tabel penuh karena hanya mencakup baris dalam indeks yang difilter .
Indeks yang difilter memiliki sejumlah batasan yang diuraikan dalam tautan ke indeks yang difilter.
Namun, jika Anda tertarik untuk memikirkan kemungkinan melewatkan Kunci Utama dan Indeks Berkelompok secara keseluruhan, Anda dapat membaca pos Markus Winand yang ditautkan di bawah ini. Dia mendemonstrasikan alasannya, dengan beberapa contoh kode, untuk menyarankan bahwa mungkin merupakan ide yang bagus untuk tidak menggunakan fitur-fitur tersebut.
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key
Namun semuanya akhirnya kembali untuk memahami aplikasi Anda dan mendesain kode, tabel, indeks, dan sebagainya agar sesuai dengan pekerjaan yang Anda lakukan.