Ölçek için tabloları bölümleme

Tamamlandı

Bölümleme kararları neredeyse kalıcıdır. Kötü seçilmiş bir bölüm anahtarı, performansı bölümlenmemiş bir tablodan daha kötü hale getirir ve çok terabaytlık bir tabloyu yeniden bölümlendirmek için uzun süreli kesintiyle tamamen yeniden oluşturulması gerekir. Tasarım sırasında seçtiğiniz bölüm anahtarı ve dizin hizalaması, bölümlemenin sisteminizi geliştirip geliştirmediğini veya kolayca geri alamayacağınız bakım kabusları oluşturup oluşturmadığını belirler.

Tablo bölümleme , büyük tabloları tek bir mantıksal tablo olarak tutarken daha küçük, daha yönetilebilir parçalara (bölümler) böler. Uygulamanız bir tablo görür, ancak veritabanı altyapısı bağımsız olarak tutulabilen, arşivlenebilen veya sorgulanabilen birden çok fiziksel kesimi yönetir.

Bölümleme kavramlarını anlama

Bölümleme birkaç temel bileşeni içerir: verilerin nasıl bölündüğünü tanımlayan bölüm işlevi , bölümleri dosya gruplarına eşleyen bir bölüm düzeni ve her satırın hangi bölüme ait olduğunu belirleyen bölümleme sütunu . Bu kavramları anlamak etkili bir bölümleme stratejisi tasarlamanıza yardımcı olur.

Performansı ve operasyonel avantajları değerlendirme

Bölümleme, sorguların yalnızca bölüm anahtarlarıyla filtrelendiği ve bu sayede sadece ilgili bölümlere erişim sağlandığı bölüm elemesi, birden çok bölümün CPU çekirdekleri arasında aynı anda işlendiği paralel işleme, tablonun tamamı yerine her bölüm için daha hızlı istatistikler hesaplanması ve daha küçük bölümlerin daha sığ B ağaçları anlamına geldiği dizin aramaları yoluyla sorgu performansında iyileştirmeler sağlar.

operasyonel avantajlar arasında eski bölümler çevrimiçi kalırken geçerli bölümde dizinleri yeniden derlediğiniz ayrıntılı bakım, meta veri işlemleri aracılığıyla eski bölümleri saniyeler içinde arşiv tablolarına geçirerek hızlı arşivleme, bölümleri bağımsız olarak tutmaktan daha iyi kullanılabilirlik ve eski bölümleri daha ucuz, daha yavaş depolamaya taşıyarak katmanlı depolama sayılabilir.

Örneğin, tarihe göre filtreleme (90% sorgu) sorgularının tablonun tamamını taradığı 1,2 TB işlem tablosuna sahip bir finansal hizmetler şirketi düşünün. Aylık bölümleme uygulandıktan sonra sorgu performansı bölüm eleme yoluyla 10-20 kat artar, dizin yeniden derlemeleri bölüm başına 6 saatten 20 dakikaya çıkar, bölüm değiştirme kullanılarak eski verilerin arşivlenmesi dört saatlik kilitlerden saniyelere düşer ve eski bölümleri daha ucuz depolama alanına taşıyarak depolama maliyetleri 40% azalır.

Bölümlemenin ne zaman kullanılacağını anlama

Aşağıdaki tabloda bölümlemenin ne zaman yardımcı olduğu ve gereksiz karmaşıklık kattığı gösterilmektedir:

Scenario Bölümleme kullanılasın mı? Neden
Sorgular, belirli bir sütuna (tarih, bölge) %80'den fazla sıklıkla filtre uygular. Evet Bölüm eleme işlemi yalnızca ilgili parçalara erişir
Eski verilerin düzenli arşivleme (aylık, üç aylık) Evet İşlemler yerine DELETE saniyeler içinde bölümleri değiştirme
Dizinleri yalnızca son verilerde yeniden oluşturmanız gerekiyor Evet Mevcut bölümü yeniden oluştururken eski bölümler çevrimiçi kalmaya devam etsin
Katmanlı depolama gereksinimleri olan büyük tablolar (terabaytlarca veri) Evet Eski bölümleri daha ucuz depolama alanına taşıma
Sorguların çoğu tablonun tamamını tarar veya çeşitli sütunlara göre filtre uygulama Hayı Taranan tüm bölümler— bölümlenmemişten daha kötü performans
Tek satırlı aramalar veya küçük aralıklı taramalar yaygın olarak görülür Hayı Bölümleme avantajları olmadan ek yük ekler
Sorgu desenleriyle uyumlu belirgin sütun yok. Hayı Etkili bir bölüm anahtarı seçemiyorum

Bölümleme bileşenleri oluşturma

Aşağıdaki örnekte üç bileşen gösterilmektedir: bölüm işlevi, bölüm düzeni ve bölümlenmiş tablo:

-- Create partition function based on date ranges
-- Use RANGE RIGHT for datetime columns to keep same-day values together
CREATE PARTITION FUNCTION PF_OrderDate (DATETIME2)
    AS RANGE RIGHT FOR VALUES 
    ('2024-01-01', '2024-04-01', '2024-07-01', '2024-10-01');

-- Create partition scheme mapping to a single filegroup (recommended)
-- Use multiple filegroups only for tiered storage or independent backups
CREATE PARTITION SCHEME PS_OrderDate
    AS PARTITION PF_OrderDate ALL TO ([PRIMARY]);

-- Create partitioned table
-- Include partition column in primary key for clustered index alignment
CREATE TABLE Orders (
    OrderID INT NOT NULL,
    OrderDate DATETIME2 NOT NULL,
    CustomerID INT,
    Amount DECIMAL(10,2),
    CONSTRAINT PK_Orders PRIMARY KEY (OrderID, OrderDate)
) ON PS_OrderDate(OrderDate);

Bu örnek, Siparişler tablosu için üç aylık bölümler oluşturur. Bölüm işlevi, beş bölüm oluşturan dört sınır değeri (Ocak, Nisan, Temmuz, Ekim) tanımlar: 2024 öncesi veriler için bir ve 2024'ün her çeyreği için dört bölüm. Bölüm düzeni tüm bölümleri BİRİnCİl dosya grubuyla eşler. Orders tablosu bölüm anahtarı olarak OrderDate sütununu kullanır. Bu sütun, doğru dizin hizalaması için birincil anahtara dahil edilmelidir.

Bölümleme stratejilerini seçme

Bölüm anahtarını seçmek, vereceğiniz en önemli karardır. Kötü bir seçim yapın ve bölümleme yardımcı olmaktan çok daha fazla acı verir. İdeal bölüm anahtarı çoğu sorgunun WHERE yan tümcesinde görünür, makul düzeyde dengeli bölümler oluşturur ve bakım desenlerinizle uyumlu hale gelir.

Aşağıdaki anahtar seçim ölçütleri doğru bölüm anahtarını seçmenize yardımcı olur:

  • Sorgu desenleri: Bu sütuna göre 80%+ sorgu filtresi
  • Veri dağıtımı: Bölümler arasında eşit dağıtım (90% veri içeren tek bir bölüm yoktur)
  • Bakım hizalaması: Arşivleme/temizleme desenlerini eşleştirir (zamana dayalı arşivleme için tarih sütunları)
  • Kararlılık: INSERT sonrasında değer değişmez (güncelleştirilebilir sütunlarda bölümlemekten kaçının)

Aralık bölümlemesini anlama

Aralık bölümleme, verileri değer aralıklarına (en yaygın tarihler) göre böler. Her bölüm belirli bir aralık (Ocak verileri, Şubat verileri vb.) içerir. Bu en yaygın kullanılan stratejidir.

Aralık bölümlemenin en iyi çalıştığı yerler şunlardır:

  • Zaman serisi verileri (siparişler, günlükler, işlemler)
  • Sıralı veriler (fatura numaraları, sipariş kimlikleri)
  • Sayısal aralıklar (maaş bantları, fiyat katmanları)

Aşağıdaki tabloda yaygın bölüm desenleri gösterilmektedir:

Desen Ne Zaman Kullanılır?
Günlük Yüksek hacimli sistemler, kısa saklama
Weekly Orta hacimli, 6-12 ay saklama
Monthly En yaygın, bölüm sayısını ve boyutunu dengeler
Üç ayda bir Daha düşük hacimli, çok yıllık saklama
Yıllık Arşiv senaryoları, uzun vadeli geçmiş verileri

Örneğin, bir e-ticaret platformunun siparişleri aylık olarak bölümlendirmesi sayesinde, geçerli ay sorguları tek bir bölüme ulaşırken, üç aylık raporlar 3 bölüme erişebilir ve yıl sonu analizi 12 bölüm kullanabilir. Bu süreçte eski yıllara ait veriler de taşınarak sistemden çıkarılır.

Bölüm işlevinde sınırları tanımlayarak aralık bölümleri oluşturabilirsiniz:

-- RANGE RIGHT creates 5 partitions: <100000, 100000-199999, 200000-299999, 300000-399999, >=400000
CREATE PARTITION FUNCTION PF_InvoiceNumber (INT)
    AS RANGE RIGHT FOR VALUES 
    (100000, 200000, 300000, 400000);

Kategorik değerlere göre bölümleme

Bölümleme özelliğini dize veya bölgeler gibi kategorik değerlerle kullanabilirsiniz RANGE . partition işlevi değerleri sıralama düzenine göre yerleştirir. Bu yaklaşım, sorguların sık sık kategoriye göre filtrelendiği coğrafi dağıtım, çok kiracılı sistemler veya departman verileri için çalışır.

Aşağıdaki örnek verileri bölgeye göre bölümler:

-- Partition by region
CREATE PARTITION FUNCTION PF_Region (NVARCHAR(50))
    AS RANGE LEFT FOR VALUES ('East', 'North', 'South', 'West');

CREATE PARTITION SCHEME PS_Region
    AS PARTITION PF_Region ALL TO ([PRIMARY]);

CREATE TABLE RegionalData (
    DataID INT NOT NULL,
    Region NVARCHAR(50) NOT NULL,
    Value DECIMAL(10,2),
    CONSTRAINT PK_RegionalData PRIMARY KEY (DataID, Region)
) ON PS_Region(Region);

Dizin bölümleme uygulama

Tabloyu bölümlediğinizde, dizinler hizalanabilir veya hizalanmamış olabilir. Hizalanmış dizinler tabloyla aynı bölüm düzenini kullanırken, hizalanmamış dizinler farklı bölümleme kullanır veya bölümleme kullanmaz. Bölümlenmiş tablolardaki kümelenmemiş dizinler varsayılan olarak tablonun bölüm düzenini devralır.

Hizalanmış ve hizalanmamış dizinleri anlama

Hizalanmış dizinler tabloyla aynı bölüm işlevini kullanır. Her dizin bölümü bir tablo bölümüyle eşleşerek hızlı bölüm değiştirme, basitleştirilmiş bakım ve daha iyi bölüm eleme olanağı sağlar.

Hizalanmamış dizinler farklı bölümleme kullanır veya bölümleme kullanmaz. Bölüm değiştirme özelliğini kullanamazlar ve 1.000'den fazla bölümü olan tablolarda desteklenmezler.

Arşivleme için bölüm değiştirme gerektiğinde, belirli bölümleri bağımsız olarak yeniden oluşturmak istediğinizde veya bölüm anahtarında sorgu desenleri filtrelendiğinde hizalanmış dizinleri kullanın.

Örneğin, Orders tablosunun OrderDate ile bölümlenmiş ve CustomerID üzerinde kümelenmemiş bir dizine sahip olduğunu düşünün. Aynı OrderDate düzeniyle hizalanmış bölümleme kullanmak, bölümleri değiştirerek, geçerli dizinleri bağımsız olarak yeniden oluşturarak ve tablonun tamamını etkilemeden eski bölümleri bırakarak eski ayların arşivlenmesine olanak tanır.

Temel tabloyla aynı bölüm düzenini kullanarak bölümlenmiş dizinler oluşturabilirsiniz:

-- Create partitioned non-clustered index
CREATE NONCLUSTERED INDEX IX_Orders_Customer
    ON Orders(CustomerID)
    ON PS_OrderDate(OrderDate);

-- Create partitioned columnstore index
CREATE NONCLUSTERED COLUMNSTORE INDEX IX_SalesData_CS
    ON SalesData(Revenue, Region)
    ON PS_SalesDate(SaleDate);

Bölüm işlemlerini yönetme

Bölümlenmiş tablolar oluşturduktan sonra bunları zaman içinde yönetmeniz gerekir. Yaygın işlemler bölüm meta verilerini sorgulamayı, veriler büyüdükçe yeni bölümler eklemeyi ve arşivleme sırasında eski bölümleri kaldırmayı içerir. Bu işlemler $PARTITION işlevini ve ALTER PARTITION FUNCTION deyimini kullanır.

Bölümleme bilgilerini sorgula

işlevini kullanarak $PARTITION bölüm bilgilerini görüntüleyebilirsiniz. Bir örnek aşağıda verilmiştir:

-- View partition information
SELECT 
    $PARTITION.PF_OrderDate(OrderDate) AS PartitionNumber,
    MIN(OrderDate) AS MinDate,
    MAX(OrderDate) AS MaxDate,
    COUNT(*) AS RowCount
FROM Orders
GROUP BY $PARTITION.PF_OrderDate(OrderDate)
ORDER BY PartitionNumber;

Yeni bölüm sınırı ekleme

kullanarak ALTER PARTITION FUNCTIONyeni sınır değerleri eklemek için bölümleri bölebilirsiniz. Bir örnek aşağıda verilmiştir:

-- Split partition to add new boundary
ALTER PARTITION FUNCTION PF_OrderDate()
    SPLIT RANGE ('2024-11-01');

Bu deyim, bölüm işlevine yeni bir sınır değeri (1 Kasım 2024) ekler ve var olan bir bölümü iki bölüme böler. Ekim ile Aralık tarihleri içeren bölüm artık iki bölüme dönüşür: biri Ekim için, diğeri Kasım ile Aralık arasında.

Bölümü arşivleme ve kaldırma

ile ALTER PARTITION FUNCTION kullanarak MERGE RANGE, eski verileri arşivlemek için bölümleri birleştirebilirsiniz. Bir örnek aşağıda verilmiştir:

-- Merge partitions to archive old data
ALTER PARTITION FUNCTION PF_OrderDate()
    MERGE RANGE ('2023-12-31');

Bölümleme en iyi yöntemlerini uygulama

Aşağıdaki en iyi yöntemler, uygulamadan sonra düzeltilmesi zor olan yaygın bölümleme hatalarından kaçınmanıza yardımcı olur:

  • Dizinleri tablo bölümleriyle hizalama: Bölüm değiştirme ve bakımı etkinleştirmek için tablolar ve dizinler için aynı bölüm düzenini kullanın
  • Veri dağıtımlarını izleme: Dengesiz bölümleri belirlemek ve bölüm elemesini doğrulamak için bölüm istatistiklerini düzenli olarak denetleyin
  • Bölüm yönetimini otomatikleştirme: Sınırları aşıp eski bölümleri arşivlemeden önce yeni bölümler eklemek için işleri zamanlama
  • Fazla bölümleme yapmaktan kaçının: Bölüm başına binlerce değil, milyonlarca satırı hedefle; çok fazla bölüm ek yük oluşturur
  • Birincil anahtara bölüm anahtarı ekle: Bölümleme düzeninde kümelenmiş dizin hizalaması için gereklidir

Bölümleme dikkatli bir planlama gerektirir. Seçtiğiniz bölüm anahtarı ve dizin hizalaması, performans elde edip etmediğinizi veya karmaşıklık oluşturup oluşturmayabileceğinizi belirler. Bölümleme doğru uygulandığında daha hızlı sorgular, verimli arşivleme ve basitleştirilmiş bakım aracılığıyla büyük tablo yönetimini dönüştürür.