Bisakah TABLE
memiliki kunci utama tanpa indeks berkerumun?
Dan dapatkah sebuah TABLE
indeks berkerumun tanpa kunci utama?
Adakah yang bisa memberi tahu saya secara singkat hubungan antara kunci utama dan indeks berkerumun?
Bisakah TABLE
memiliki kunci utama tanpa indeks berkerumun?
Dan dapatkah sebuah TABLE
indeks berkerumun tanpa kunci utama?
Adakah yang bisa memberi tahu saya secara singkat hubungan antara kunci utama dan indeks berkerumun?
Kunci utama adalah konsep logis - ini adalah pengenal unik untuk baris dalam tabel. Dengan demikian, ia memiliki banyak atribut - tidak boleh null, dan harus unik. Tentu saja, karena Anda cenderung sering mencari record dengan pengenal uniknya, sebaiknya Anda memiliki indeks pada kunci utama.
Indeks berkerumun adalah konsep fisik - ini adalah indeks yang memengaruhi urutan penyimpanan catatan di disk. Ini menjadikannya indeks yang sangat cepat saat mengakses data, meskipun dapat memperlambat penulisan jika kunci utama Anda bukan nomor urut.
Ya, Anda dapat memiliki kunci utama tanpa indeks berkerumun - dan terkadang, Anda mungkin menginginkannya (misalnya ketika kunci utama Anda adalah kombinasi kunci asing pada tabel penggabungan, dan Anda tidak ingin menimbulkan overhead pengocokan disk saat menulis).
Ya, Anda bisa membuat indeks berkerumun pada kolom yang bukan kunci utama.
Tabel dapat memiliki kunci utama yang tidak berkerumun, dan tabel berkerumun tidak memerlukan kunci utama. Jadi jawaban untuk kedua pertanyaan tersebut adalah ya.
Indeks berkerumun menyimpan semua kolom di tingkat daun. Itu berarti indeks berkerumun berisi semua data dalam tabel. Tabel tanpa indeks berkerumun disebut heap.
Kunci utama adalah indeks unik yang dikelompokkan secara default. Secara default berarti bahwa ketika Anda membuat kunci utama, jika tabel belum berkerumun, kunci utama akan dibuat sebagai indeks unik berkerumun. Kecuali jika Anda menentukan
nonclustered
opsi secara eksplisit .Contoh, di mana
t1
memiliki kunci utama yang tidak terkluster, dant2
tidak berkerumun tetapi memiliki kunci utama:create table t1 (id int not null, col1 int); alter table t1 add constraint PK_T1 primary key nonclustered (id); create clustered index IX_T1_COL1 on t1 (col1); create table t2 (id int not null, col1 int); alter table t2 add constraint PK_T2 primary key nonclustered (id);
Contoh di SQL Fiddle.
sumber
Pertama-tama, lihat Tabel yang Diatur Indeks dan Indeks Tergugus . Sebenarnya, saya merekomendasikan membaca keseluruhan Use the Index Luke! situs dari awal hingga Anda mencapai topik pengelompokan untuk benar-benar memahami apa yang sedang terjadi.
Sekarang, untuk pertanyaan Anda ...
Ya, gunakan kata kunci NONCLUSTERED saat mendeklarasikan kunci utama Anda untuk membuat tabel berbasis heap. Sebagai contoh:
CREATE TABLE YOUR_TABLE ( YOUR_PK int PRIMARY KEY NONCLUSTERED -- Other fields... );
Ini sangat disayangkan, karena banyak orang tampaknya hanya menerima default (yang CLUSTERED), meskipun dalam banyak kasus tabel berbasis heap sebenarnya lebih baik (seperti yang dibahas di artikel terkait).
Tidak seperti beberapa DBMS lainnya, MS SQL Server akan membiarkan Anda memiliki indeks pengelompokan yang berbeda dari kunci utama, atau bahkan tanpa kunci utama sama sekali.
Contoh berikut membuat indeks pengelompokan terpisah dari PK, yang memiliki batasan UNIK di atasnya, yang mungkin Anda inginkan dalam banyak kasus:
CREATE TABLE YOUR_TABLE ( YOUR_PK int PRIMARY KEY, YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED -- Other fields... );
Jika Anda memilih indeks pengelompokan non-unik (menggunakan
CREATE CLUSTERED INDEX ...
), MS SQL Server akan secara otomatis membuatnya unik dengan menambahkan bidang tersembunyi ke dalamnya.Harap dicatat bahwa manfaat pengelompokan paling terlihat untuk pemindaian rentang. Jika Anda menggunakan indeks pengelompokan yang tidak "sejajar" dengan pemindaian rentang yang dilakukan oleh aplikasi klien Anda (seperti saat terlalu mengandalkan kolom tersembunyi yang disebutkan di atas, atau pengelompokan pada kunci pengganti ), Anda cukup banyak mengalahkan tujuan pengelompokan.
Di bawah MS SQL Server, kunci utama juga dikelompokkan secara default . Anda dapat mengubah default itu, seperti dibahas di atas.
sumber
Jawaban diambil dari MSDN Menggunakan Indeks Clustered
Bisakah TABEL memiliki kunci utama tanpa Indeks Tergugus? - Iya.
Bisakah TABEL memiliki Indeks Tergugus tanpa kunci primer? - Iya.
Sebuah Primary Key adalah kendala yang menjamin keunikan dari nilai-nilai, sehingga berturut-turut selalu dapat diidentifikasi secara khusus oleh kunci yang.
Sebuah indeks secara otomatis ditetapkan ke tombol primer (sebagai baris sering "melihat ke atas" dengan kunci utama mereka).
Sebuah indeks non-clustered adalah urutan logis baris, oleh salah satu (atau lebih) dari kolom nya. Anggap saja sebagai "salinan" lain dari tabel, diurutkan berdasarkan kolom apa pun yang dilintasi indeks.
Sebuah clustered index adalah ketika sebenarnya tabel secara fisik diperintahkan oleh kolom tertentu. Sebuah tabel tidak akan selalu memiliki indeks berkerumun (yaitu sementara itu akan secara fisik diurutkan oleh sesuatu , hal itu mungkin tidak terdefinisi ). Sebuah tabel tidak dapat memiliki lebih dari satu indeks berkerumun, meskipun ia dapat memiliki indeks berkerumun komposit tunggal (yaitu tabel secara fisik diurutkan oleh misalnya Nama Belakang, Nama Depan, DOB).
PK seringkali (tetapi tidak selalu) merupakan indeks berkerumun.
sumber
Untuk apa nilainya, di MS SQL Server semua kolom di kunci utama harus ditetapkan sebagai NOT Null, sementara membuat indeks berkerumun unik tidak memerlukan ini. Tidak yakin tentang sistem DB lain.
sumber
Mungkin tidak ada kaitannya dengan jawaban atas pertanyaan ini, tetapi beberapa aspek penting pada kunci primer dan Indeks Tergugus adalah ->
Jika ada kunci utama (Secara Default Yang merupakan Indeks Tergugus, namun kita dapat mengubahnya) dengan Indeks Tergugus, maka kita tidak dapat membuat satu lagi indeks berkerumun untuk tabel itu. Tetapi jika kunci utama belum ada, dan ada indeks berkerumun, maka kita tidak dapat membuat kunci utama dengan Indeks Tergugus.
sumber