SQL Server satır yönelimli depolamada, hem kümelenmiş hem de kümelenmemiş dizinler B ağaçları olarak düzenlenir.
( Görüntü Kaynağı )
Kümelenmiş endeksler ve non kümelenmiş endeksler arasındaki temel fark kümelenmiş dizin yaprak düzey olmasıdır olduğu tablo. Bunun iki sonucu vardır.
- Kümelenmiş dizin yaprak sayfalarındaki satırlar , tablodaki (seyrek olmayan) sütunların her biri için her zaman bir şey içerir (değer veya gerçek değere bir işaretçi).
- Kümelenmiş dizin, tablonun birincil kopyasıdır.
Kümelenmemiş dizinler, INCLUDE
anahtar olmayan tüm sütunları açıkça dahil etmek için yan tümcesi (SQL Server 2005'ten beri) kullanarak nokta 1'i de yapabilir, ancak bunlar ikincil temsillerdir ve verilerin her zaman başka bir kopyası vardır (tablonun kendisi).
CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)
CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)
Yukarıdaki iki dizin neredeyse aynı olacaktır. Üst düzey dizin sayfaları anahtar sütunlar için değerler A,B
ve yaprak düzeyi sayfalarA,B,C,D
Veri satırlarının kendileri yalnızca bir sırada sıralanabildiğinden, tablo başına yalnızca bir kümelenmiş dizin olabilir.
Çevrimiçi SQL Server kitaplarından yukarıdaki alıntı çok karışıklığa neden oluyor
Benim düşünceme göre çok daha iyi ifade olurdu.
Kümelenmiş dizinin yaprak düzeyi satırları tablo satırları olduğundan , tablo başına yalnızca bir kümelenmiş dizin olabilir .
Kitaplar online alıntı yanlış değil ama hem kümelenmemiş hem de kümelenmiş endekslerin "sıralama" fiziksel değil mantıklı olduğu açık olmalıdır. Bağlantılı listeyi izleyerek sayfaları yaprak düzeyinde okur ve sayfadaki satırları yuva dizisi sırasına göre okursanız, dizin satırlarını sıralı olarak okursunuz, ancak fiziksel olarak sayfalar sıralanamayabilir. Kümelenmiş bir dizinle satırların her zaman fiziksel olarak diskte dizin anahtarıyla aynı sırada depolandığına dair yaygın inanç .
Bu saçma bir uygulama olacaktır. Bir satır 4GB masanın ortasına yerleştirilir Örneğin SQL Server yok değil yeni eklenen satıra ilişkin yapmak odasına dosyadaki verilerin 2 GB kadar kopyalamak gerekiyor.
Bunun yerine bir sayfa ayrımı gerçekleşir. Kümelenmiş ve kümelenmemiş dizinlerin yaprak düzeyindeki her sayfa File:Page
mantıksal anahtar sırasıyla bir sonraki ve bir önceki sayfanın adresine ( ) sahiptir. Bu sayfaların bitişik veya anahtar sırada olması gerekmez.
örneğin, bağlantılı sayfa zinciri 1:2000 <-> 1:157 <-> 1:7053
Sayfa bölme gerçekleştiğinde, dosya grubundaki herhangi bir yerden yeni bir sayfa ayrılır (karma tablolardan, küçük tablolar için veya bu nesneye ait boş olmayan tek biçimli bir boyuttan veya yeni tahsis edilen tek biçimli boyuttan). Dosya grubu birden fazla içeriyorsa, bu aynı dosyada bile olmayabilir.
Mantıksal düzen ve bitişikliğin idealize edilmiş fiziksel versiyondan ne derece farklı olduğu mantıksal parçalanma derecesidir.
Tek bir dosya ile yeni oluşturulmuş bir veritabanında aşağıdakileri çalıştırdım.
CREATE TABLE T
(
X TINYINT NOT NULL,
Y CHAR(3000) NULL
);
CREATE CLUSTERED INDEX ix
ON T(X);
GO
--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
@X AS INT
SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number BETWEEN 1 AND 100
ORDER BY CRYPT_GEN_RANDOM(4)
OPEN @C1;
FETCH NEXT FROM @C1 INTO @X;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO T (X)
VALUES (@X);
FETCH NEXT FROM @C1 INTO @X;
END
Ardından, sayfa düzenini
SELECT page_id,
X,
geometry::Point(page_id, X, 0).STBuffer(1)
FROM T
CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER BY page_id
Sonuçlar her yerde vardı. Anahtar sırasındaki ilk satır (1 değeriyle - aşağıdaki okla vurgulanmış) neredeyse son fiziksel sayfada bulunuyordu.
Parçalanma, mantıksal düzen ile fiziksel düzen arasındaki korelasyonu arttırmak için bir dizin yeniden oluşturularak veya yeniden organize edilerek azaltılabilir veya kaldırılabilir.
Koşu sonrası
ALTER INDEX ix ON T REBUILD;
Aşağıdakileri aldım
Tablonun kümelenmiş bir dizini yoksa buna yığın adı verilir.
Kümelenmemiş dizinler, bir yığın veya kümelenmiş bir dizin üzerine oluşturulabilir. Her zaman taban tablasına kadar bir sıra bulucu içerirler. Bir yığın durumunda bu fiziksel bir satır tanımlayıcıdır (rid) ve üç bileşenden oluşur (Dosya: Sayfa: Yuva). Kümelenmiş bir dizin olması durumunda, satır bulucu mantıklıdır (kümelenmiş dizin anahtarı).
İkinci durumda, kümelenmemiş dizin zaten doğal olarak CI anahtar sütunlarını NCI anahtar sütunları veya INCLUDE
-d sütunları olarak içeriyorsa, hiçbir şey eklenmez. Aksi takdirde, eksik CI anahtar sütunları sessizce NCI'ye eklenir.
SQL Server her zaman anahtar sütunlarının her iki dizin türü için benzersiz olmasını sağlar. Ancak bunun benzersiz olarak bildirilmeyen dizinler için uygulandığı mekanizma, iki dizin türü arasında farklılık gösterir.
Kümelenmiş dizinler uniquifier
, var olan bir satırı çoğaltan anahtar değerlere sahip satırlar için eklenir. Bu sadece artan bir tamsayıdır.
Benzersiz SQL Server olarak bildirilmeyen kümelenmemiş dizinler için, sessizce satır bulucuyu kümelenmemiş dizin anahtarına ekler. Bu, yalnızca gerçekten yinelenen satırlar için değil, tüm satırlar için geçerlidir.
Kümelenmiş ve kümelenmemiş adlandırma sütun deposu dizinleri için de kullanılır. Kağıt SQL Server Sütun Mağazaları yapılan geliştirmeler devletler
Sütun deposu verileri herhangi bir anahtarda gerçekten "kümelenmemiş" olsa da, birincil dizine kümelenmiş dizin olarak gönderme yapan geleneksel SQL Server kuralını korumaya karar verdik.