Apakah ada SQL Server 2008 yang setara dengan klausa MENGGUNAKAN INDEKS di Oracle? Khusus untuk konstruk:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
Dalam Dokumentasi Sql Server tentang Indeks Unik itu menyatakan (penekanan ditambahkan):
Indeks unik diimplementasikan dengan cara berikut:
Kendala UTAMA atau kendala UNIK
Saat Anda membuat batasan PRIMARY KEY, indeks berkerumun unik pada kolom atau kolom secara otomatis dibuat jika indeks berkerumun pada tabel belum ada dan Anda tidak menentukan indeks nonclustered unik . Kolom kunci utama tidak dapat mengizinkan nilai NULL.
Yang tampaknya menyiratkan bahwa ada cara menentukan indeks apa yang harus digunakan untuk Kunci Utama.
create table c (c1 int not null primary key, c2 int)
Jawaban:
Tidak. Ketika Anda membuat kunci utama atau batasan unik dalam SQL Server, indeks unik untuk mendukung batasan itu dibuat secara otomatis, dengan kunci yang sama.
Tidak. Dokumentasi hanya berusaha menjelaskan apakah indeks pendukung otomatis akan dibuat sebagai clustered atau nonclustered, jika Anda tidak menentukan. Ini membingungkan, saya setuju.
Untuk memperjelas, saat Anda menambahkan batasan kunci utama ke tabel yang ada tanpa menyatakan preferensi, indeks pendukung akan dikelompokkan jika tidak ada indeks berkerumun di meja yang sudah ada sebelumnya. Indeks pendukung akan dibuat sebagai nonclustered jika sudah ada indeks berkerumun
Anda dapat secara khusus meminta kunci primer yang dikelompokkan atau tidak menggunakan menggunakan:
PRIMARY KEY CLUSTERED
atauPRIMARY KEY NONCLUSTERED
.Dalam keadilan, dokumentasi jauh lebih jelas tentang subjek di:
table_constraint (Transact-SQL)
sumber
Sintaks SQL Server untuk membuat indeks berkerumun yang juga merupakan kunci utama adalah:
Sejauh komentar Anda: "membuat PK menggunakan indeks bernama", kode di atas akan menghasilkan indeks kunci utama yang dinamai "PK_c".
Kunci primer dan kunci pengelompokan tidak harus kolom yang sama. Anda dapat mendefinisikannya secara terpisah. Pada contoh di atas, ubah
CLUSTERED
kata kunci menjadiNONCLUSTERED
, lalu tambahkan indeks berkerumun menggunakanCREATE INDEX
sintaksis:Dalam SQL Server indeks berkerumun adalah tabel, mereka satu-dan-sama. Indeks berkerumun mendefinisikan urutan logis dari baris yang disimpan dalam tabel. Dalam contoh pertama saya, baris disimpan dalam urutan nilai-nilai
c1
danc2
kolom. Karena kunci pengelompokan juga didefinisikan sebagai kunci utama, kombinasi daric1
danc2
harus unik untuk seluruh tabel.Dalam contoh kedua, kunci utama terdiri dari kolom
c1
danc2
, namun kunci pengelompokan hanyac2
kolom. Karena saya tidak menentukanUNIQUE
atribut dalamCREATE INDEX
pernyataan, kunci pengelompokan (c2
) tidak harus unik di seluruh tabel. "Uniquifier" akan secara otomatis dibuat oleh SQL Server dan ditambahkan ke nilai-nilai dic2
kolom untuk membuat kunci pengelompokan. Kunci pengelompokan ini, karena sekarang unik, kemudian akan digunakan sebagai id baris dalam indeks lain yang dibuat di tabel.Untuk membuktikan kunci pengelompokan mengontrol tata letak baris dalam penyimpanan, Anda dapat menggunakan fungsi tidak berdokumen
fn_PhysLocCracker(%%PHYSLOC%%)
,. Kode berikut menunjukkan baris diletakkan pada disk sesuai urutanc2
kolom, yang telah saya definisikan sebagai kunci pengelompokan:Hasil dari tempdb saya , adalah:
Pada gambar di atas, tiga kolom pertama adalah output dari
fn_PhysLocCracker
fungsi, yang menunjukkan urutan fisik baris pada disk. Anda dapat melihatslot_id
nilai meningkatkan kunci-langkah denganc2
nilai, yang merupakan kunci pengelompokan. Indeks kunci utama menyimpan baris dalam urutan yang berbeda, yang dapat dilihat dengan memaksa SQL Server untuk mengembalikan hasil dari pemindaian kunci utama:Catatan, saya tidak menggunakan
ORDER BY
klausa dalam pernyataan di atas karena saya mencoba untuk menunjukkan urutan item dalam indeks kunci utama.Output dari query di atas adalah:
Melihat ke
fn_PhysLocCracker
fungsi, kita dapat melihat urutan fisik dari indeks kunci primer.Karena kita secara eksklusif membaca dari indeks itu sendiri, yaitu tidak ada kolom di luar indeks yang direferensikan dalam kueri,
%%PHYSLOC%%
nilai - nilai mewakili halaman dalam indeks itu sendiri.Hasil:
sumber