PK dizinindeki sütunların sırası önemli midir?
Evet öyle.
Varsayılan olarak, birincil anahtar kısıtlaması, benzersiz bir kümelenmiş dizin tarafından SQL Server'da uygulanır. Kümelenmiş dizin , tablodaki satırların mantıksal sırasını tanımlar . B-ağacı endeksinin üst seviyelerini temsil etmek için eklenmiş bir kaç ilave indeks sayfası olabilir, fakat kümelenmiş bir indeksin en düşük (yaprak) seviyesi sadece verinin mantıksal sırasıdır.
Açıkçası, bir sayfadaki satırların fiziksel olarak kümelenmiş dizin anahtarı sırasına göre depolanması gerekmez . Sayfa içinde her satıra bir işaretçi koyan ayrı bir yönlendirme yapısı vardır. Bu yapı, kümelenmiş dizin tuşları ile sıralanır. Ayrıca, her sayfa kümelenmiş dizin tuşu sırasındaki aynı düzeyde önceki ve sonraki sayfaya bir işaretçi içerir.
Kümelenmiş bir birincil anahtar ile (RowNumber, DataDate)
, satırlar önce mantıksal olarak önce RowNumber
ve sonra DataDate
sırayla - yani RowNumber = 1
mantıksal olarak gruplandırılmış tüm satırlar , sonra nerede RowNumber = 2
ve benzerleri tarafından sıralanır .
Yeni veriler eklediğinizde ( RowNumbers
1'den n'ye kadar olan) yeni satırlar mantıksal olarak varolan sayfalara aittir, bu nedenle SQL Server'ın yer açmak için büyük miktarda iş bölme sayfası yapması gerekir. Tüm bu faaliyetler kazanç elde etmek için (değişikliklerin kaydedilmesi dahil) çok fazla ek iş üretiyor.
Bölünmüş sayfalar da yaklaşık% 50 boşalmaya başlar, bu nedenle aşırı bölme düşük sayfa yoğunluğuna (sayfa başına en uygun olandan daha az satır) neden olabilir. Diskten okumak için sadece bu kötü haber değil (düşük yoğunluklu = okunacak daha fazla sayfa), düşük yoğunluklu sayfalar da önbellekte saklandıklarında bellekte daha fazla yer kaplar.
Kümelenmiş dizininin olarak değiştirilmesi, (DataDate, RowNumber
yeni DataDates
sayfaların (muhtemelen şu anda depolanandan daha yüksek olan) yeni sayfalarda kümelenmiş dizinin mantıksal sonuna eklendiği anlamına gelir . Bu, sayfaların gereksiz yere aşırı yüklenmesini ortadan kaldıracak ve daha hızlı yükleme süresi sağlayacaktır. Daha az parçalı veri aynı zamanda ileriye dönük bir etkinliğin (devam eden bir sorgu için hemen önce diskten sayfaları okumak) daha verimli olabileceği anlamına gelir.
Başka bir şey, sorgularınız arama yapmak için çok daha muhtemeldir DataDate
daha RowNumber
. Kümelenmiş bir dizin açık (DataDate, RowNumber
), dizinin aranmasını DataDate
(ve sonra RowNumber
) destekler. Mevcut düzenleme, yalnızca üzerinde araştırma yapmayı destekler RowNumber
(ve ancak o zaman, belki de DataDate
). DataDate
Birincil anahtar değiştirildikten sonra mevcut kümelenmemiş dizini bırakabilirsiniz . Kümelenmiş dizin, değiştirildiği kümelenmemiş dizinden daha geniş olacaktır, bu nedenle performansın kabul edilebilir kaldığından emin olmak için test etmelisiniz.
Yeni verileri içe aktarırken bcp
, içe aktarma dosyasındaki veriler kümelenmiş dizin tuşlarına göre (ideal olarak (DataDate, RowNumber
) sıralanırsa ve bcp
seçeneği belirtirseniz daha yüksek performans elde edebilirsiniz :
-h "ORDER(DataDate,RowNumber), TABLOCK"
En iyi veri yükleme performansı için, minimum düzeyde giriş yapmış ekler elde etmeye çalışabilirsiniz. Daha fazla bilgi için bakınız: