Varsayılan olarak PK kümelenmiştir ve çoğu durumda bu iyidir. Ancak, hangi soru sorulmalıdır:
- PK'm kümelenmeli mi?
- kümelenmiş dizinim için hangi sütun (lar) en iyi anahtar olacak?
PK ve Kümelenmiş indeks 2 farklı şeydir:
- PK bir kısıtlamadır. PK, satırları benzersiz bir şekilde tanımlamak için kullanılır, ancak depolama kavramı yoktur. Ancak, varsayılan olarak (SSMS'de), henüz kümelenmiş bir dizin yoksa benzersiz bir kümelenmiş dizin tarafından zorlanır.
- Kümelenmiş dizinler, satır verilerini yaprak düzeyinde depolayan, yani her zaman kapsadığı anlamına gelen özel bir dizin türüdür. Anahtarın parçası olsun veya olmasın, tüm sütunlar yaprak düzeyinde saklanır. Benzersiz olması gerekmez, bu durumda kümelenmiş anahtara bir benzersizleştirici (4 bayt) eklenir.
Şimdi 2 soru ile karşılaşıyoruz:
- Masamdaki (PK) satırları benzersiz bir şekilde nasıl tanımlamak istiyorum?
- Bir dizinin yaprak düzeyinde nasıl saklamak istiyorum (Kümelenmiş Dizin)
Nasıl olduğuna bağlıdır:
- veri modelinizi tasarlıyorsunuz
- verilerinizi sorgularsınız ve sorgularınızı yazarsınız
- verilerinizi ekler veya güncellersiniz
- ...
İlk olarak, kümelenmiş bir dizine ihtiyacınız var mı? Toplu olarak eklerseniz, sıralanmamış verileri bir HEAP'ye (kümedeki sıralı verilere karşı) depolamak daha verimlidir. Satırları benzersiz bir şekilde tanımlamak ve sayfalarda depolamak için RID (Satır Tanımlayıcı, 8 bayt) kullanır.
Kümelenmiş dizin rastgele bir değer olmamalıdır. Yaprak seviyesindeki veriler indeks anahtarı tarafından saklanacak ve sıralanacaktır. Bu nedenle parçalanma veya sayfa bölünmesini önlemek için sürekli büyümelidir. Bu PK tarafından gerçekleştirilemezse, başka bir anahtarı kümelenmiş bir aday olarak düşünmelisiniz. Tanımlama sütunlarındaki, sıralı GUID'deki veya hatta ekleme tarihi gibi bir şeydeki kümelenmiş dizin, tüm satırlar son yaprak sayfasına ekleneceğinden, sıralı bir bakış açısından iyidir. Öte yandan, benzersiz tanımlayıcı bir PK olarak iş gereksinimleriniz için yararlı olsa da, kümelenmemelidir (rastgele sıralanır / oluşturulur).
Bazı veri ve sorgu analizlerinden sonra, kümelenmiş PK'da anahtar arama yapmadan önce verilerinizi almak için çoğunlukla aynı dizini kullandığınızı fark ederseniz, verilerinizi benzersiz bir şekilde tanımlamamasına rağmen bunu kümelenmiş dizin olarak düşünebilirsiniz.
Kümelenmiş dizin anahtarı, dizine eklemek istediğiniz tüm sütunlardan oluşur. Benzersiz bir sütun (4 bayt), üzerinde benzersiz bir kısıtlama yoksa (kopyalar için artan değer, aksi takdirde null) eklenir. Bu dizin anahtarı, daha sonra tüm kümelenmemiş dizinlerinizin yaprak düzeyinde her satır için bir kez saklanacaktır. Bazıları ayrıca birkaç kez indeks ağacının (B-ağacı) kökü ve yaprak seviyesi arasındaki ara seviyelerde (dal) saklanacaktır. Anahtar çok büyükse, kümelenmemiş tüm dizin büyür, daha fazla depolama alanı ve daha fazla IO, CPU, bellek, gerekir ... Ad + doğum tarihi + ülkesinde bir PK'niz varsa, bu anahtar büyük olasılıkla iyi bir aday değil. Kümelenmiş bir dizin için çok büyük. NEWSEQUENTIALID () kullanan benzersiz tanımlayıcı, sıralı olmasına rağmen genellikle dar bir anahtar (16 bayt) olarak değerlendirilmez.
Ardından, tablonuzdaki satırları nasıl benzersiz bir şekilde tanımlayacağınızı anladıktan sonra, bir PK ekleyebilirsiniz. Sorgunuzda kullanmayacağınızı düşünüyorsanız, kümelenmiş olarak oluşturmayın. Bazen sorgulamanız gerekiyorsa, başka bir kümelenmemiş dizin oluşturabilirsiniz. PK'nın otomatik olarak benzersiz bir dizin oluşturacağını unutmayın.
Kümelenmemiş dizinler her zaman kümelenmiş anahtarı içerecektir. Ancak, dizinlenmiş sütunlar (+ anahtar sütunlar) kapsayıcıysa, kümelenmiş dizinde herhangi bir anahtar araması olmaz. Kümelenmemiş bir dizine Include ve Where ekleyebileceğinizi unutmayın. (akıllıca kullanın)
Kümelenmiş dizin benzersiz olmalı ve mümkün olduğunca dar Kümelenmiş dizin zaman içinde değişmemeli ve aşamalı olarak eklenmelidir.
Şimdi tablo, kümelenmiş ve kümelenmemiş dizinler ve kısıtlamalar oluşturacak bazı SQL yazma zamanı.
Bunların hepsi teoriktir çünkü veri modelinizi ve kullanılan veri tiplerini bilmiyoruz (A ve B).