SORU
13 AĞUSTOS 2012, PAZARTESİ


Özellikle ilgili birincil anahtar performans olarak bir GUID kullanmak için en iyi yöntemler nelerdir?

Neredeyse tüm tablolarda Birincil Anahtar olarak GUID kullanan bir uygulama var ve Birincil Anahtar olarak GUID kullanırken performansı ile ilgili sorunlar olduğunu okudum. Dürüst olmak gerekirse, ben hiç görmedim herhangi bir sorun, ama başlamak üzereyim yeni bir uygulama ve hala kullanmak istiyorsanız GUID olarak Birincil Anahtarlar, ama düşünüyordum kullanarak bir Bileşik Birincil Anahtar (GUID ve belki de başka bir alan.)

Ben kullanarak bir GUID çünkü onlar güzel ve kolay yönetmek farklı ortamlar gibi "üretim", "test" ve "dev" veritabanları ve aynı zamanda göç verileri arasında veritabanları.

Varlık Çerçevesi uygulama kodu Guıd atamak istiyorum 4.3 ve veritabanı eklemeden önce kullanacağım. (yani ben SQL Guıd oluşturmak izin vermek istemiyorum).

Sözde performans vurur bu yaklaşım ile ilişkili önlemek için GUID tabanlı Birincil anahtar oluşturmak için en iyi uygulama nedir?

CEVAP
13 AĞUSTOS 2012, PAZARTESİ


GUID birincil anahtar için doğal bir seçim gibi görünebilir - ve eğer gerçekten gerekiyorsa, muhtemelen tablonun BİRİNCİL ANAHTAR kullanmak için ileri sürülebilir. Ben şiddetle tavsiye ediyorumyapmak için değilkullanım olarak GUID sütunküme anahtarıSQL Server varsayılan olarak yok, eğer siz özel olarak değil.

Gerçekten iki konu dışında tutmak gerekir:

  1. birincil anahtarbir mantıksal yapısı - eşsiz ve iddialı bir tablodaki her satırı tanımlayan aday anahtarlarından biridir. Bu bir şey gerçekten olabilir - INT, GUID, bir dize - size senaryo için en mantıklı seçim.

  2. küme anahtarı""tablo) - bu kümelenmiş dizin . tanımlayan (sütun veya sütunlar ^em>fizikseldepolama ile ilgili bir şey, ve burada, küçük, istikrarlı, sürekli artan veri türü en iyi seç varsayılan seçenek olarak - INT BIGINT.

Varsayılan olarak, SQL Server bir tabloda birincil anahtar da kümeleme anahtarı olarak kullanılır - ama bu şekilde olmak zorunda değil! Ben zaten kişisel olarak görülen büyük performans kazançları ne zaman ayrılıyor önceki GUID tabanlı Birincil / Kümelenmiş Anahtar iki ayrı anahtar - birincil (mantıksal) anahtar GUID ve kümeleme (sipariş) anahtar ile ilgili ayrı INT IDENTITY(1,1) sütun.

Kimberly Tripp - Kraliçe Dizin Oluşturma - ve diğerleri var ifade pek çok kez GUID olarak kümeleme anahtarı değil, uygun beri nedeniyle kendi rastgelelik, neden olacaktır büyük sayfa ve dizin parçalanma ve genellikle kötü performans.

Evet, biliyorum - newsequentialid() SQL Server 2005 ve ancak bu bile değil gerçekten ve tamamen sıralı ve böylece de uğrar aynı sorunları gibi GUID - sadece biraz daha az belirgin.

Sonra başka bir sorun için düşünün: kümeleme anahtarı üzerinde bir tablo eklenecektir her giriş ve her olmayan kümelenmiş dizin tablo de - böylece gerçekten istediğiniz emin olmak için bu kadar küçük Olası. Tipik olarak, bir INT 2 milyar satır yeterli olmalıdır için büyük çoğunluğu tabloları - karşılaştırmalı bir GUID olarak kümeleme anahtarı, kendini kurtarabilirsin yüzlerce megabayt depolama disk ve sunucu belleği.

Hızlı hesaplama - Birincil olarak INT vs GUID kullanarak ve Anahtar Kümeleme:

  • 1'000'000 satır (rom.15: 26 vs 3.8 MB) . temel Tablo
  • 6 kümelenmiş dizinler (91.55 vs 22.89 MB)

TOPLAM: 106 vs MB 25- ve bu sadece tek bir tablo!

Düşünce için yiyecek bir şeyler - Kimberly Tripp tarafından mükemmel şeyler okuyup, tekrar, Özet oku! SQL Server dizin oluşturma müjde, gerçekten.

PS: eğer sadece bir kaç yüz veya bir kaç bin satır - bu tür tartışmaların en çok üzerinde fazla bir etkisi olmayacak ile uğraşıyorsanız elbette. Eğer satır, binlerce hatta milyonlarca sayımı başlatın - onlarca veya yüzlerce olursa . ancak: ^strong>sonrabu noktaları anlamak için çok önemli ve çok önemli hale gelir.

Güncelleme:olmasını istiyorsanız PKGUID sütun birincil anahtar (ama senin kümeleme anahtar), ve başka bir sütun MYINT (INT IDENTITY) olarak kümeleme anahtarı kullanın:

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: bunu yapmak zorundasınaçıkçasöyle PRIMARY KEY sınırlaması yok NONCLUSTERED (aksi takdirde oluşturulan olarak kümelenmiş bir dizin, varsayılan olarak) - ve sonra da oluşturduğunuz bir saniye Endeksi bu tanımlanan CLUSTERED

Bu iş - ve eğer "yeniden tasarlanmış" performans için gereken mevcut bir sistem varsa geçerli bir seçenek olacak Yeni bir sistem, eğer sıfırdan başlamak ve bir çoğaltma senaryo, o zaman derdim hep ID INT IDENTITY(1,1) benim gibi kümelenmiş bir birincil anahtar - çok daha verimli daha başka bir şey!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunnyboxx

    bunnyboxx

    17 NİSAN 2008
  • Christopher Bill

    Christopher

    30 NİSAN 2009
  • SoundHound

    SoundHound

    8 Mart 2006