Hubungan Primary Key dan Clustered Index

92

Bisakah TABLEmemiliki kunci utama tanpa indeks berkerumun?

Dan dapatkah sebuah TABLEindeks berkerumun tanpa kunci utama?

Adakah yang bisa memberi tahu saya secara singkat hubungan antara kunci utama dan indeks berkerumun?

F11
sumber

Jawaban:

102

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.

Neville Kuyt
sumber
1
Hai. Topiknya sudah lama, tapi mungkin seseorang bisa menjawab pertanyaan saya. Jika kolom dideklarasikan NOT NULL UNIQUE CLUSTERED INDEX, akankah menjadikannya PRIMARY KEY melakukan perubahan aktual pada performa atau semacamnya?
jesse
Itu pertanyaan yang menarik. Saya akan berasumsi tidak, karena harus melakukan semua pemeriksaan yang sama dengan cara apa pun.
Jonathan Allen
Jawaban yang brilian.
NikosV
Tetapi kebanyakan, kolom kunci utama dengan indeks berkerumun akan berguna karena menyederhanakan pencarian jangkauan.
hunter_tech
34

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 nonclusteredopsi secara eksplisit .

Contoh, di mana t1memiliki kunci utama yang tidak terkluster, dan t2tidak 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.

Andomar
sumber
19

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


Bisakah TABEL memiliki kunci utama tanpa Indeks Tergugus?

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


dan Bisakah TABEL memiliki Indeks Tergugus tanpa kunci primer?

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.


Adakah yang bisa memberitahu saya secara singkat hubungan kunci primer dan indeks berkerumun?

Di bawah MS SQL Server, kunci utama juga dikelompokkan secara default . Anda dapat mengubah default itu, seperti dibahas di atas.

Branko Dimitrijevic
sumber
4

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.

Sepster
sumber
Di SQL Server, kunci utama akan dikelompokkan secara default - kecuali jika Anda secara eksplisit melarangnya. Tapi itu hanya default - bukan persyaratan.
marc_s
Bisakah tabel memiliki kunci utama tanpa indeks apa pun? Karena, ketika saya mengatakan bahwa satu kolom adalah kunci utama, secara default dibuat indeks berkerumun. Saat menghapus indeks, tabel tidak lagi berisi kunci utama?
veljasije
1

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.

robotj
sumber
Ini lebih merupakan komentar di bawah jawaban yang ditandai sebagai yang benar.
Jan Doggen
1
Selamat datang - Saya memberi Anda +1 karena saya melihat Anda belum punya reputasi untuk menambahkan komentar. (Berada di sana, lakukan itu :)
Reversed Engineer
0

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.

himanshupareek66
sumber