SQL Server Bölümleme - bölüm anahtarı için ne kullanılır?


10

SQL Server bölümleme ile hiç çalışmadım ama şu anda birimlerin muhtemelen onu garanti ettiği bir veritabanı tasarlamakla karşı karşıya kaldım. Sistem kuponlar içindir. Kuponlar periyodik olarak, genellikle altı haftada bir düzenlenecektir, ancak geçici bir düzenleme de yapılacaktır - örneğin özel bir etkinlik için. 15 milyon müşteri var ve her ihraç etkinliği için, her müşteri 6 farklı kupon türü alacak ve toplam 90 milyon kupon örneği verecek. Kupon örneği itfa verilerini izlememiz ve bunu 6 ay boyunca korumamız gerekir, ancak tipik olarak bir kupon yalnızca altı hafta boyunca geçerlidir. Geçersiz bir kupon için herhangi bir itfa talebi veritabanına ulaşmayacaktır çünkü POS tarafından onaylanacaktır.

Altı aylık bir süre boyunca Kupon Örneği tablosunda 360 milyon satır ve Tekliften yararlanma tablosunda 72 milyon adede kadar (maksimum% 20 ödeme oranı varsayılır) depolamamız gerekecek. Bu sayıların tek bir disk bölümü için çok büyük olduğunu hissediyorum?

Benim sorum - bölüm anahtarı olarak ne kullanılır? Belirgin bir aday, yaklaşık 6 bölüm verecek şekilde düzenleme etkinliği olacaktır. Ama sonra, bunun bile en iyi performans için çok büyük bir bölüm boyutu vereceğini düşünüyorum. İki anahtarla bölümleme yapmak mümkün müdür, örneğin düzenleme etkinliği + müşteri kimliğinin son basamağı gibi? Yani mantık şöyle olur:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Ayrıca, ihtiyacımız olacak veritabanı sunucusunun spec emin değilim. 16GB ve 8CPU'lar yeterli olacak mı? Db, bir saniyeden daha kısa bir sürede sayısal bir barkod değeri üzerinde anahtarlanmış kupon örneği tablosundan bir sonuç döndürmek gerekir. Validate (select) ve redeem (insert) için beklenen işlem talebinin dakikada yaklaşık 3.500'e ulaşması bekleniyor.

SQL Server 2008r2 64bit db sunucusu, yüksek performanslı ve yüksek kapasiteli SAN'a erişimi olan çok güçlü bir ana bilgisayardan VM olarak sağlanacaktır.

Benzer birimleri yönetmek için bir SQL Server çözümü dağıtmış olanlardan tavsiye için çok minnettar olurum.

Saygılarımızla

Rob.


2
Tablolarınız hala küçük - bölümler için gerek yok, bölüm olmadan birkaç milyar satır içeren bir masam var, çalışıyor. Bölümleri FAST DROP için güzel olsa da.
TomTom

1
Saçma @TomTom, bölümler satır sayımlarında bunun bir kısmını yararlı olabilir. Bölümleme şemasının, bir performans kazancı elde etmek için erişim modellerine fayda sağlaması gerekir, ancak bu boyutta bir "GEREK YOK" battaniyesi basit yanlıştır.
Mark Storey-Smith

1
Hayır, doğru. İHTİYACINIZ! = Fayda. İHTİYACINIZ bölümler olmadan sorgular yapmak sorunları karşılaştığınızda.
TomTom

1
Hey @TomTom Sanırım küçük bir mola arkadaşına ihtiyacın var, bu gerçekten saldırgan olmasa bile biraz güçlü. Mark StoreySmith ile hemfikirim, bir battaniye "GEREK YOK" basit yanlıştır, ancak muhtemelen gerekmediği iddianız doğrudur. Bunun bir indeksleme meselesi olduğunu düşünüyorum. Mark'ın ihtiyaç ve fayda açısından ne demek istediğinizi bildiğini de biliyorum. Hepimizi biraz kes ve kafeine bırak, k? (Ve güven bana, bazı günlerde çok az sabrım olduğu biliniyor, özellikle de bugün sırtımda ağrı ilaçları olduğum günlerde)
jcolebrand

Yanıtlar:


14

Sunucuya özgü sorular Serverfault veya DBA.SE'ye yönlendirilmelidir.

Bölümleme sorusu için, bunun için bölümleme yapmanız gerekeceğini sanmıyorum.

360m sıralar çok fazla ama çok hantal değil.

Do DEĞİL hiçbir koşulda bir alanın son rakamdan dayalı bölüm deneyin. Bunun işe yarayacağından emin değilim, ancak SARGable değil ki bu da makul değil.

Sayısal anahtara göre yalnızca tek bir satır araması yapmanız gerekiyorsa, bölümleme muhtemelen yardımcı olmaz.

Bölüm rotasını izlemeye karar verirseniz, tüm sorgularınızın bölüm anahtarlarınızı içermesi gerektiğini aklınızda bulundurun, böylece motor hangi bölümü kontrol edeceğini bilir. Aksi takdirde hepsini kontrol eder ve aslında performansınıza zarar verirsiniz.



Ben de aynı fikirdeyim. Bazen sadece daha iyi dizinlere ihtiyacınız olur.
jcolebrand

@JNK'ya katılmıyorum. Bölüm eliminasyonundan yararlanan sayısal bir anahtara dayanan tek satırlı arama, ES'yi azaltır. Erişim örüntüleri, sık erişilen bölümler üzerinden sık erişilen bölümler arabellek havuzunda kalacaksa, daha fazla performans avantajınız olur. Ve bölümlemenin size kısmi kullanılabilirlik sağladığı en sevdiğim özelliğe bile değinmedik.
Mark Storey-Smith

Kayıt için, diğer noktalarınızda yürekten katılıyorum :)
Mark Storey-Smith

@ MarkStorey-Smith - Bu onun anahtarına bağlı olacak. OP'de şu anda tanımlandığı gibi, bölüm herhangi bir değer katmayacaktır. Ayrıca, bir tarih alanı veya "normal" bir bölüm şeması ile iki bölümlü bir anahtar kullanamayacağı gibi geliyor.
JNK

5

Kalıcı bir hesaplanmış sütun kullanıyorsanız birden çok tuşa bölümleme YAPABİLİRSİNİZ; diğerlerinin söylediği gibi, bölümleme her durum için işe yaramaz. Senaryoyu size özel tavsiyeler verecek kadar iyi anladığımdan emin değilim, ama bazı genel yönergeler şunlardır:

  • Bölümleme, bölümleme anahtarı SQL deyiminin bir parçası olduğunda verilerin okunmasında yararlıdır, bu da optimize edicinin bölüm hariç tutmayı başlatmasını sağlar. Seçtiğiniz anahtarın çoğu sorgu için yararlı olduğundan emin olmanız gerekir.

  • İyi bir bölümleme stratejisinin bir yararı, verilerin yaşlanmasıdır; örneğin, bölüm anahtarınız tarihe dayalıysa (örneğin, yılın günü) ve belirli bir tarihten daha eski olan tüm verileri kaldırmak istiyorsanız, bu bölümleri boş bir tabloya geçirmek ve kısaltmak çok kolaydır.


4

Gereksinimlerinizi biraz daha açık bir şekilde tanımlamanız gerekiyor. 6 ayda yaklaşık 360 milyon satıra sahip olacağınızdan bahsettiniz. 2 yıl içinde ne dersiniz? Hala büyümekte olduğunuz oranda büyüyecek misiniz? Yoksa üstel büyüme yaşama şansınız var mı? Verileri bu tabloda sonsuza kadar saklamak istiyor musunuz? veya verileri düzenli olarak arşivlemek ister misiniz?

Bölümleme, veri arşivleme için kullanılabilir. Kayan pencere senaryosuna bakın. Bu teknik incelemeye ve buna bakın .

Bölümleme, dizin parçalanmasını yönetmek için de kullanılabilir. Belirli bölümleri yeniden oluşturabilir / yeniden düzenleyebilirsiniz.

Ayrıca, bölümlenmiş görünümleri bölümlenmiş tabloların aksine dikkate almalısınız. Bölümlenmiş Görünümler için SQL Server Enterprise lisansı gerekmez. Bölümlenmiş görünümler ayrıca belirli bir "bölüm" üzerinde çevrimiçi dizin yeniden oluşturma gerçekleştirmenizi sağlar.

Felaket kurtarma planlaması yaparken bölümleme de düşünülebilir. Kısmi veritabanı kurtarma için kullanılabilir. Örneğin: eski bölümlerinizi ana / geçerli bölümlerden farklı bir dosya grubunda tutabilirsiniz. Ve sonra kurtarırken, birincil dosya grubunu, ardından geçerli bölümlerinizin bulunduğu dosya grubunu kurtarır ve son olarak eski bölümlerin bulunduğu dosya gruplarını geri yükleyebilirsiniz. Bu, uygulamanızın kapatılması gereken süreyi azaltabilir.

Bölümleme hakkında Kimberly Tripp bu harika video göz atın .


Verileri sadece altı ay tutmamız gerekiyor. Her hafta, altı aydan daha önce yayınlanan kuponları silecek bir temizlik işi yapardık.
Rob Bowman

3
Temel olarak, her hafta yaklaşık 15 milyon satırı silmeniz / kaldırmanız gerekir. Masa ne kadar geniş? Tabloyu tarihe göre sütunlara bölmenizi öneririm. Bu şekilde haftalık siler basit bir meta işlem olacaktır. Tek yapmanız gereken, ana bölümlenmiş tablodan en eski bölümü bir hazırlama tablosuna çevirmek. Sonra hazırlama tablosunu bırakın. Buna Sürgülü Windows senaryosu denir. Bunu nasıl yapacağımı ilk gönderdiğim makaleye bakın.
Dharmendar Kumar 'DK'

-2

Eski verileri arşivleme nedeniyle bölümleme yapmadığınız sürece, bunu yanlış nedenden dolayı yapıyorsunuz ve yapmamalısınız.


2
Arşivlemenin yanı sıra bölümlemeyi kullanmanın birçok nedeni vardır; bölüm hariç tutma doğru şekilde kullanılırsa birçok farklı sorgu türüne büyük yarar sağlar.
Stuart Ainsworth

Stuart'a katılıyorum, bu biraz kötü bir tavsiye.
jcolebrand
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.