GUID'ler birincil anahtarınız için doğal bir seçim gibi görünebilir - ve gerçekten yapmanız gerekiyorsa, bunu tablonun PRIMARY KEY'i için kullanmayı iddia edebilirsiniz. Ne şiddetle tavsiye ediyorum yapmamaya olarak GUID sütun kullanmaktır kümeleme anahtarının özel olarak bunu değil söylemediğiniz sürece, SQL Server varsayılan olarak yapar.
Gerçekten iki konuyu birbirinden ayırmanız gerekiyor:
Birincil anahtar mantıksal yapıdır - benzersiz ve güvenilir bir tablodaki her satır tanımlayan aday anahtarlarından biridir. Bu, herhangi bir şey olabilir - gerçekten INT
, bir GUID
, bir dize - senaryonuz için en anlamlı olanı seçin.
kümeleme anahtar (sütun veya tablo üzerinde "kümelenmiş bir dizin" define sütunlar) - this is a fiziksel küçük, istikrarlı, sürekli artan veri türü en iyi yoldur, burada depolama ilgili bir şey, ve - INT
veya BIGINT
senkronize eder varsayılan seçenek.
Varsayılan olarak, bir SQL Server tablosundaki birincil anahtar da kümeleme anahtarı olarak kullanılır - ancak bu şekilde olması gerekmez! Kişisel olarak önceki GUID tabanlı Birincil / Kümelenmiş Anahtarı iki ayrı anahtara ayırırken büyük performans artışları gördüm - GUID'deki birincil (mantıksal) anahtar ve ayrı bir INT IDENTITY(1,1)
sütundaki kümeleme (sıralama) anahtarı .
As Kimberly Tripp indeksleme Kraliçesi - - ve diğerleri pek çok kez belirttiğimiz - Bir GUID
kümelenme anahtarının rastgelelik nedeniyle beri, bu kitlesel sayfa ve endeks parçalanma ve genellikle kötü performans sağlayacaktır, optimum olmasın.
Evet, biliyorum - newsequentialid()
SQL Server 2005 ve üstü - ama bu gerçekten ve tamamen sıralı değildir ve bu nedenle aynı problemlerden muzdariptir GUID
- sadece biraz daha az belirgin.
Sonra göz önünde bulundurulması gereken başka bir sorun var: bir tablodaki kümeleme anahtarı, tablonuzdaki kümelenmemiş her bir dizinin her girişine de eklenecektir - böylece gerçekten mümkün olduğunca küçük olduğundan emin olmak istersiniz. Tipik olarak, INT
tabloların büyük çoğunluğu için 2+ milyar satırlık bir yeterli olmalıdır GUID
ve kümeleme anahtarı olarak karşılaştırıldığında , diskte ve sunucu belleğinde yüzlerce megabayt depolama alanı kaydedebilirsiniz.
Hızlı hesaplama - kullanılarak INT
vs GUID
İlk ve Kümelenme Anahtar olarak:
- 1000.000 satır içeren Temel Tablo (3.8 MB ve 15.26 MB)
- 6 kümelenmemiş dizin (22.89 MB ve 91.55 MB)
TOPLAM: 25 MB ve 106 MB - ve bu sadece tek bir masada!
Düşünce için biraz daha yiyecek - Kimberly Tripp tarafından mükemmel şeyler - okuyun, tekrar okuyun, sindirin! Gerçekten SQL Server indeksleme müjdesi.
PS: tabii ki, sadece birkaç yüz veya birkaç bin satırla uğraşıyorsanız - bu argümanların çoğunun gerçekten sizin üzerinde bir etkisi olmayacaktır. Ancak: Eğer onlarca veya yüzlerce satır binlerce içine almak ya da milyonlarca saymaya başla eğer - o zaman bu noktalar çok önemli ve anlamak çok önemli hale gelir.
Güncelleme: Eğer yapmak istiyorsanız PKGUID
birincil anahtar olarak sütun (ancak kümeleme anahtarı) ve başka bir sütun MYINT
( INT IDENTITY
sizin kümeleme anahtar olarak) - kullanırız
CREATE TABLE dbo.MyTable
(PKGUID UNIQUEIDENTIFIER NOT NULL,
MyINT INT IDENTITY(1,1) NOT NULL,
.... add more columns as needed ...... )
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable
PRIMARY KEY NONCLUSTERED (PKGUID)
CREATE UNIQUE CLUSTERED INDEX CIX_MyTable ON dbo.MyTable(MyINT)
Temelde: Sadece zorunda açıkça söylemek PRIMARY KEY
o en o kısıtlamasını NONCLUSTERED
(aksi takdirde, varsayılan olarak kümelenmiş endeksi olarak yarattı) - ve sonra olarak tanımladı ikinci indeks oluşturmakCLUSTERED
Bu işe yarar - ve performans için "yeniden tasarlanması" gereken bir sisteminiz varsa geçerli bir seçenektir. Yeni bir sistem için, sıfırdan başlarsanız ve bir çoğaltma senaryosunda değilseniz, o zaman her zaman ID INT IDENTITY(1,1)
kümelenmiş birincil anahtarım olarak seçerim - her şeyden çok daha verimli!