Bölüm anahtarı aynı zamanda birincil anahtarın bir parçası olmak zorunda mı?


24

Bir birincil anahtar olmayan bir sütuna dayalı bir tablo bölümlendiriyorum? Bugün bölüm sütununun birincil anahtarın bir parçası olması gerekip gerekmediğiyle ilgili bazı çelişkili bilgiler okudum. Bağırsaklarım hayır der, ama% 100 emin değilim. Yani sorular ...

  1. Bölüm sütunu birincil bölümün bir parçası olmalı mı? Öyle ya da böyle mi tavsiye edilir?
  2. Bölüm anahtarı için bir dizin oluşturmak zorunda mıyım, yoksa DBMS bunu otomatik olarak kendi başına mı yapıyor?

Yanıtlar:


11

Bir şey değil.

Bölümleme için en yaygın senaryolardan biri, PK'nızla tamamen ilgili olmayan bir tarih alanı kullanmaktır.

Örneğin Orders, alanla ilgili bir tablonuz OrderDatevarsa, büyük olasılıkla ay ve yıla göre bölümlemelisiniz OrderDate.

Kayıtlar eskimeye başladığında ve artık alakalı olmadığında, bu bölümleri artık işlenmemeleri için bir arşiv tablosuna veya veritabanına taşıyabilirsiniz.

Bölümleme hemen hemen her alanda çalışır, ancak WELL'in çalışması için bölümlendirdiğiniz alan (lar) sorgularınızın çoğunda olmasa da en çok kullanılmalıdır. Bölüm anahtarlarınızı içermezseniz, temelde birden fazla tablodan (bölümler) geçen pahalı bir tablo taraması alırsınız.

DÜZENLE

2. bölüm için cevabın da iyi olmadığını düşünüyorum . Bölüm anahtarı, satırı hangi bölüme koyacağımızı belirlemek için kullanılır, ancak bir dizinin tutulduğunu sanmıyorum. Yine de arka tarafta istatistikler olabilir.


10
Bunun eski olduğunu biliyorum, ama beni yanlış bir yola soktu, bu yüzden başkaları için yorum yapabileceğimi düşündüm. Bölümleme özelliğinin SWITCH yeteneklerini kullanmak istiyorsanız, Bölüm Sütunu Birincil anahtarda olmalıdır. Eğer birincil anahtarda değilse, şu hatayı alırsınız: Partition columns for a unique index must be a subset of the index key.
Vaccano

Ben @Vaccano katılıyorum
san

3

JNK'nın cevabına ek olarak, muhtemelen tablo bölümlerini ve dizin bölümlerini hizalamayı tartışan bu makaleyi de okumalısınız .

Bölümleme şemasının birincil anahtarın ilk sütununu tam olarak takip ettiği birçok senaryo türü vardır - örneğin, bir olgu tablosunun anlık görüntü tarihinin genellikle bölüm sütununun yanı sıra birincil anahtardaki ilk sütun olduğu bir veri ambarı senaryosunda.

Fakat eşit olarak, PK'nin bir KİMLİK veya başka bir vekil anahtar olduğu OLTP ortamlarında, bölümleme için bunu kullanmak pek mantıklı değildir, çünkü keyfi numaralara ayrılmak normalde çok faydalı değildir. OLTP sistemlerinde, en çok tarihe (muhtemelen PK’de değil), ancak potansiyel olarak bölgesel olarak veya bir tür örgütsel bölünme (belki de bir vekil kullanmıyorsanız PK’da) ayrılma eğilimindedir.

Ama bu bir gereklilik değil.


Eh, bir sürü şey bir gereklilik değildir. Endeksleme bile bir gereklilik değildir! İşlevsel olarak anlam ifade etmek için, aday bir anahtarın ana sütununda bölümlendirme yapılması gerekir. Aksi halde uygulama mimarı tabloyu nasıl kullanır?
srini.venigalla

@ srini.venigalla Bu yaygın bir durumdur, ancak başka bir ortak durum (aynı şekilde mi?), birincil veya aday anahtarın bir parçası olmayan bir şey üzerinde bölümlendirme yapmaktır - bölümleme genellikle arşivleme için kullanılır, son kullanma tarihi olabilir iyi bir bölüm seçimi. Ancak bunun bir anahtarın parçası olabileceğini ima eden hiçbir şey yok. Bölümleme, oldukça genel olan ve her ikisi de çevrelerinde meşru en iyi uygulamalara sahip olan en az iki farklı ve çelişkili kullanım modeli bulunan düşük seviyeli bir özelliktir.
Cade Roux

0

Birincil anahtarın bir parçası değilse, Aday Anahtarın bir parçası olmalıdır. Fikir, bölümlemenizin birincil anahtarla aynı hizada olması gerekir.

Yani cevap, evet, PK’nın bir parçası olması tercih edilir. Başka bir anahtar değilse, bir PK olacak kadar eşit derecede iyidir.


Aday Anahtar'ı hiç duymadım. Birisi Create / Alter table ifadesinde nasıl belirtilir?
AngryHacker

Aday Anahtarı, Birincil Anahtar olmaya hak kazanan başka bir anahtardır. Örneğin, kimlik birincil anahtardır. Ancak aynı tabloda, örneğin başka bir sütun varsa. PERSON_ID ayrıca, Aday Anahtar adı verilen bir satırı benzersiz olarak tanımlayabilir. 2. ve 3. normalleştirme kuralları tüm aday anahtarlarına karşı da uygulanmalıdır.
srini.venigalla

Anladım. Sorumun ikinci kısmı ne olacak?
AngryHacker 10:12

Diğer endekslerle aynı. örnek: CREATE INDEX IX_ProductVendor_VendorID Satın Alma AÇIK. ProductVendor (BusinessEntityID);
srini.venigalla

4
Bu kesinlikle yanlıştır. PK ile ilgili olmayan pek çok alanda bölümlendirme yapabilirsiniz OrderDate. Taleplerini destekleyecek bir şeyin var mı?
JNK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.