Birincil Anahtar ve Kümelenmiş Dizin İlişkisi


92

TABLEKümelenmiş bir dizin olmadan birincil anahtara sahip olabilir mi?

Ve TABLEbir birincil anahtara sahip olmadan kümelenmiş bir dizine sahip olabilir mi?

Biri bana kısaca birincil anahtar ile kümelenmiş dizin arasındaki ilişkiyi söyleyebilir mi?

Yanıtlar:


102

Birincil anahtar, mantıksal bir kavramdır - tablodaki bir satır için benzersiz tanımlayıcıdır. Bu nedenle, bir dizi niteliğe sahiptir - boş olmayabilir ve benzersiz olmalıdır. Elbette, kayıtları benzersiz tanımlayıcılarına göre çok fazla arayacağınız için, birincil anahtarda bir dizine sahip olmak iyi olacaktır.

Kümelenmiş dizin fiziksel bir kavramdır - kayıtların diskte depolanma sırasını etkileyen bir dizindir. Bu, verilere erişirken çok hızlı bir dizin yapar, ancak birincil anahtarınız sıralı bir sayı değilse yazma işlemlerini yavaşlatabilir.

Evet, kümelenmiş bir dizin olmadan birincil anahtara sahip olabilirsiniz - ve bazen bunu isteyebilirsiniz (örneğin, birincil anahtarınız bir katılım tablosundaki yabancı anahtarların bir kombinasyonuysa ve disk karıştırma ek yüküne maruz kalmak istemiyorsanız yazarken).

Evet, birincil anahtar olmayan sütunlarda kümelenmiş bir dizin oluşturabilirsiniz.


1
Selam. Konu eski, ama belki birisi soruma cevap verebilir. Sütun BOŞ BENZERSİZ KÜMELENMİŞ DİZİN DEĞİL olarak bildirilirse, onu PRIMARY KEY yapmak performans veya herhangi bir şey üzerinde gerçek bir değişiklik yapar mı?
jesse

Bu ilginç bir soru. Her iki şekilde de aynı kontrolleri yapması gerektiğinden hayır kabul ediyorum.
Jonathan Allen

Harika cevap.
NikosV

Ancak çoğunlukla , kümelenmiş indeksi olan bir birincil anahtar sütunu, aralık aramasını çok kolaylaştırdığı için yararlı olacaktır.
hunter_tech

34

Bir tablonun kümelenmemiş bir birincil anahtarı olabilir ve kümelenmiş bir tablo birincil anahtar gerektirmez. Yani her iki sorunun da cevabı evet.

Kümelenmiş bir dizin, tüm sütunları yaprak düzeyinde depolar. Bu, kümelenmiş bir dizinin tablodaki tüm verileri içerdiği anlamına gelir. Kümelenmiş dizini olmayan bir tabloya yığın adı verilir.

Birincil anahtar, varsayılan olarak kümelenmiş benzersiz bir dizindir. Varsayılan olarak, bir birincil anahtar oluşturduğunuzda, tablo henüz kümelenmemişse, birincil anahtarın kümelenmiş benzersiz bir dizin olarak oluşturulacağı anlamına gelir. nonclusteredSeçeneği açıkça belirtmediğiniz sürece .

Bir örnek, nerede t1 kümelenmemiş birincil anahtar ve t2kümelenmiş değildir, ancak birincil anahtar var

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

SQL Fiddle'da örnek.


19

Öncelikle, Dizinle Düzenlenmiş Tablolara ve Kümelenmiş Dizinlere bir göz atın . Aslında, Dizini Kullan Luke! neler olup bittiğini gerçekten anlamak için baştan kümeleme konusuna ulaşıncaya kadar site.

Şimdi sorularınıza ...


Bir TABLO, Kümelenmiş Dizin olmadan birincil anahtara sahip olabilir mi?

Evet, yığın tabanlı bir tablo oluşturmak için birincil anahtarınızı bildirirken NONCLUSTERED anahtar sözcüğünü kullanın. Örneğin:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

Bu talihsiz bir durumdur, çünkü pek çok kişi varsayılanı (KÜMELENMİŞTİR) kabul ediyor gibi görünmektedir, ancak çoğu durumda yığın tabanlı bir tablo aslında daha iyi olacaktır (bağlantılı makalede tartışıldığı gibi).


ve TABLO, birincil anahtar olmadan Kümelenmiş Dizine sahip olabilir mi?

Diğer bazı DBMS'lerden farklı olarak, MS SQL Server, birincil anahtardan farklı veya hatta birincil anahtara sahip olmadan bile bir kümeleme indeksine sahip olmanıza izin verecektir.

Aşağıdaki örnek, PK'den ayrı bir kümeleme dizini oluşturur ve bunun üzerinde UNIQUE kısıtlaması vardır ve çoğu durumda muhtemelen isteyeceğiniz şey budur:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

Benzersiz olmayan bir kümeleme dizini seçerseniz (kullanarak CREATE CLUSTERED INDEX ...), MS SQL Server gizli bir alan ekleyerek onu otomatik olarak benzersiz kılacaktır.

Lütfen kümelemenin faydalarının en çok menzil taramalarında görünür olduğunu unutmayın. İstemci uygulamalarınız tarafından yapılan aralık taramalarıyla "hizalanmayan" bir kümeleme dizini kullanıyorsanız (yukarıda bahsedilen gizli sütuna aşırı güvenirken veya bir vekil anahtarında kümeleme yaparken ), hemen hemen kümeleme amacını bozmak.


Biri bana kısaca birincil anahtar ile kümelenmiş dizin arasındaki ilişkiyi söyleyebilir mi?

MS SQL Server altında, birincil anahtar da varsayılan olarak kümelenmiştir . Yukarıda tartışıldığı gibi bu varsayılanı değiştirebilirsiniz.


4

Kümelenmiş Dizinler Kullanılarak MSDN'den alınan yanıtlar

Bir TABLO, Kümelenmiş Dizin olmadan birincil anahtara sahip olabilir mi? - Evet.

Bir TABLO, birincil anahtar olmadan Kümelenmiş Dizine sahip olabilir mi? - Evet.

Bir Birincil Anahtar bir olan kısıt olmasını sağlar bir satır her zaman bu anahtar ile özel olarak tespit edilebilir, öyle ki, değerleri benzersizliğini söyledi.

Bir dizin otomatik olarak birincil anahtara atanır (çünkü satırlar genellikle birincil anahtarları tarafından "aranır").

Bir olmayan kümelenmiş dizin sütunları bir (veya daha fazla) Satırların mantıksal sipariş vardır. Bunu, tablonun, dizinin karşısındaki sütunlara göre sıralanmış başka bir "kopyası" olarak düşünün.

Bir kümelenmiş dizin zaman olduğu gerçek tablo fiziksel olarak belirli bir sütuna göre sıralanır. Bir tablonun her zaman kümelenmiş bir indeksi olmayacaktır (yani fiziksel olarak bir şey tarafından sıralanırken , bu şey tanımlanmamış olabilir ). Bir tablonun birden fazla kümelenmiş dizini olamaz, ancak tek bir bileşik kümelenmiş dizine sahip olabilir (yani tablo fiziksel olarak örneğin Soyadı, Adı, DOB ile sıralanmıştır).

PK genellikle (ancak her zaman değil) kümelenmiş bir dizindir.


SQL Server'da, siz açıkça belirtmediğiniz sürece birincil anahtar varsayılan olarak kümelenecektir. Ancak bu sadece bir varsayılan - bir gereklilik değil.
marc_s

Bir tablonun indeksi olmayan birincil anahtarı olabilir mi? Çünkü bir sütunun birincil anahtar olduğunu söylediğimde, varsayılan olarak kümelenmiş indeks oluşturulur. Dizini sildiğinizde, tablo artık birincil anahtar içermiyor mu?
veljasije

1

Değeri ne olursa olsun, MS SQL Server'da birincil anahtardaki tüm sütunlar NOT Null olarak tanımlanmalıdır, ancak benzersiz kümelenmiş dizin oluşturmak bunu gerektirmez. Yine de diğer DB sistemlerinden emin değilim.


Bu, doğru olarak işaretlenen cevabın altındaki bir yorumdur.
Jan Doggen

1
Hoş geldiniz - Size +1 veriyorum çünkü yorum eklemek için henüz bir itibara sahip olmadığınızı görüyorum. (Oradaydı, bunu yaptım :)
Reversed Engineer

0

Bu soruya yanıt olarak ilgili olmayabilir, ancak birincil anahtar ve Kümelenmiş Dizinler hakkındaki bazı önemli hususlar şunlardır: ->

Clustered Index ile bir birincil anahtar varsa (Varsayılan olarak Clustered Index, ancak bunu değiştirebiliriz), o zaman o tablo için bir tane daha kümelenmiş indeks oluşturamayız. Ancak henüz bir birincil anahtar seti yoksa ve kümelenmiş bir dizin varsa, Kümelenmiş Dizin ile bir birincil anahtar oluşturamayız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.