AnalyticDB for PostgreSQL, büyük bir tabloyu bölümlere ayırmanıza olanak tanır. Böylece sorgular yalnızca filtre koşullarıyla eşleşen bölümleri tarar, tam tablo taramalarından kaçınır ve sorgu performansını artırır.
Bölümlemenin ne zaman kullanılacağı
Bölümleme, aşağıdaki üç koşulun da geçerli olduğu durumlarda en iyi sonucu verir:
Tablo büyüktür. Çok sayıda satır içeren tablolar bölümleme için iyi adaylardır.
Sorgu performansı yetersizdir. Yalnızca kabul edilebilir düzeyden daha yavaş yanıt süreleri üreten tabloları bölümleyin.
Sorgu yüklemelerinde net erişim desenleri vardır. Tipik sorgularınızdaki
WHEREyan tümcelerini kontrol edin. Aynı sütunlar tekrar tekrar görünüyorsa bu sütunlar doğal bölüm anahtarı adaylarıdır.
Desteklenen bölümleme türleri
| Tür | Verilerin nasıl bölündüğü | Tipik kullanım durumu |
|---|---|---|
| Aralık bölümleme | Tarih veya tamsayı gibi sayısal aralık | Zaman serisi verileri, artan kimlikler |
| Liste bölümleme | Açık değer listesi | Bölge veya durum gibi kategorik veriler |
| Çok düzeyli bölümleme | Birden fazla düzeyde aralık ve listenin birleşimi | Birden fazla filtre boyutuna sahip büyük veri kümeleri |
Bölüm anahtarı seçme
Bölüm anahtarı, bölüm budamanın etkili çalışıp çalışmadığını belirler:
Sorgu yüklemelerinizle eşleşmelidir.
WHEREyan tümcelerinde en sık görünen sütunu veya sütunları seçin. Bölüm budama, yalnızca sorgu koşulları bölüm anahtarını içerdiğinde etkilidir.Veri saklama stratejinizle uyumlu olmalıdır. Eski verileri düzenli olarak toplu halde siliyorsanız silinecek verilerin tek bir bölüme düşecek şekilde bölümler tasarlayın. Bir bölümü bırakmak, bir
DELETEdeyimi çalıştırmaktan çok daha hızlıdır.Birincil anahtar kısıtlaması. Tablonun birincil anahtarı varsa bölüm anahtarı birincil anahtar sütunu olmalıdır. Birincil anahtar yoksa herhangi bir sütun kullanılabilir.
Aralığa göre bölümlenmiş bir tablo oluşturma
Bir aralık içindeki bölümleri otomatik olarak oluşturmak için START, END ve EVERY değerlerini belirtin. Varsayılan olarak START dahildir ve END hariçtir.
Tarihe göre bölümleme:
CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( START (date '2016-01-01') INCLUSIVE
END (date '2017-01-01') EXCLUSIVE
EVERY (INTERVAL '1 day') );
Varsayılan bir bölümle tamsayıya göre bölümleme:
CREATE TABLE rank (id int, rank int, year int, gender char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
( START (2006) END (2016) EVERY (1),
DEFAULT PARTITION extra );
DEFAULT PARTITION , tanımlanan tüm aralıkların dışında kalan satırları yakalar.
Listeye göre bölümlenmiş bir tablo oluşturma
Bölüm anahtarı, değer karşılaştırmasını destekleyen veri türüne sahip herhangi bir sütun olabilir. Her bölüm için bir değer açıklaması bildirin.
CREATE TABLE rank (id int, rank int, year int, gender
char(1), count int )
DISTRIBUTED BY (id)
PARTITION BY LIST (gender)
( PARTITION girls VALUES ('F'),
PARTITION boys VALUES ('M'),
DEFAULT PARTITION other );
Çok düzeyli bölümlenmiş bir tablo oluşturma
Aşağıdaki örnekte üç düzeyli bölümlenmiş bir tablo oluşturulmaktadır:
Düzey:
yearsütununa göre aralığa göre bölümlenirDüzey (alt bölüm):
monthsütununa göre aralığa göre bölümlenirDüzey (alt bölüm):
regionsütununa göre listeye göre bölümlenir
CREATE TABLE sales (id int, year int, month int, day int,
region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BY RANGE (month)
SUBPARTITION TEMPLATE (
START (1) END (13) EVERY (1),
DEFAULT SUBPARTITION other_months )
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE (
SUBPARTITION usa VALUES ('usa'),
SUBPARTITION europe VALUES ('europe'),
SUBPARTITION asia VALUES ('asia'),
DEFAULT SUBPARTITION other_regions )
( START (2002) END (2012) EVERY (1),
DEFAULT PARTITION outlying_years );
Bölüm ekleme
Mevcut bir bölümlenmiş tabloya bölüm eklemek için ALTER TABLE ... ADD PARTITION kullanın.
Tablo bir alt bölüm şablonuyla oluşturulduysa yeni bölüm otomatik olarak alt bölümlere ayrılır:
ALTER TABLE sales ADD PARTITION
START (date '2017-02-01') INCLUSIVE
END (date '2017-03-01') EXCLUSIVE;
Alt bölüm şablonu kullanılmadıysa bölümü eklerken alt bölümleri satır içi olarak tanımlayın:
ALTER TABLE sales ADD PARTITION
START (date '2017-02-01') INCLUSIVE
END (date '2017-03-01') EXCLUSIVE
( SUBPARTITION usa VALUES ('usa'),
SUBPARTITION asia VALUES ('asia'),
SUBPARTITION europe VALUES ('europe') );
Mevcut bir bölümü alt bölümlere ayırmak için:
ALTER TABLE sales ALTER PARTITION FOR (RANK(12))
ADD PARTITION africa VALUES ('africa');
Varsayılan bölümü olan bir tabloya bölüm eklenemez. Bu tür bir tabloya bölüm eklemek için bunun yerine varsayılan bölümü bölün. Bkz. Bölümü bölme .
Bölüm adı belirtme
AnalyticDB for PostgreSQL V6.3.10.9 sürümünden itibaren bir tablo oluştururken bölümlere açık adlar atamak için WITH(tablename=<tablename>) yan tümcesini kullanın:
CREATE TABLE partition_with_name_list (a int, b int, c int) DISTRIBUTED BY (a) PARTITION BY LIST (a)
(
PARTITION p1 VALUES (1) WITH (tablename='partition_with_name_list_p1'),
PARTITION p2 VALUES (2) WITH (tablename='partition_with_name_list_p2'),
PARTITION p3 VALUES (3) WITH (tablename='partition_with_name_list_p3'),
PARTITION p4 VALUES (4) WITH (tablename='partition_with_name_list_p4')
);
Bölümü yeniden adlandırma
AnalyticDB for PostgreSQL V6.3.10.9 sürümünden itibaren bir bölümü şu şekilde yeniden adlandırın:
ALTER TABLE partition_with_name_list_p1 RENAME TO partition_with_name_list_p1r;
Bölümü bölme
Bir bölümü ikiye ayırmak için ALTER TABLE ... SPLIT PARTITION kullanın.
Sınırlamalar:
Alt bölümler varsa yalnızca en düşük düzeydeki alt bölüm bölünebilir.
ATyan tümcesindeki bölme değeri ikinci bölüme atanır.
Mevcut bir bölümü bölme:
Aşağıdaki örnekte Ocak 2017 bölümü 16 Ocak tarihinde bölünmektedir. 1–15 Ocak tarihleri arasındaki veriler ilk bölüme, 16–31 Ocak tarihleri arasındaki veriler ise ikinci bölüme gider.
ALTER TABLE sales SPLIT PARTITION FOR ('2017-01-01')
AT ('2017-01-16')
INTO (PARTITION jan171to15, PARTITION jan1716to31);
Yeni bir bölüm eklemek için varsayılan bölümü bölme:
Bir tablonun varsayılan bölümü olduğunda adlandırılmış bir bölüm oluşturmak için bu bölümü bölün. Varsayılan bölüm, INTO yan tümcesinde ikinci bölüm olmalıdır.
ALTER TABLE sales SPLIT DEFAULT PARTITION
START ('2017-01-01') INCLUSIVE
END ('2017-02-01') EXCLUSIVE
INTO (PARTITION jan17, default partition);
Bölüm granülerliğini belirleme
Bölüm granülerliği, her bölümdeki veri miktarı ile toplam bölüm sayısı arasında bir denge gerektirir. Daha ince granülerlik, her bölümde daha az veri ancak daha fazla bölüm sayısı anlamına gelir.
Genel bir kılavuz olarak bölüm sayısını tablo başına 200 veya daha az tutun. Çok sayıda bölüm veritabanı performansını düşürebilir; örneğin, sorgu optimizasyonu yürütme planlarını oluşturmak için daha uzun süre alır ve VACUUM işlemlerinin tamamlanması daha uzun sürer.
Bölümlenmiş tablo sorgularını optimize etme
AnalyticDB for PostgreSQL bölüm budamayı destekler: Bir sorgu bölüm anahtarı üzerinde koşullar içeriyorsa optimizasyon, tüm tablo yerine yalnızca eşleşen bölümleri tarar.
Budamanın etkin olduğunu doğrulayın:
EXPLAIN
SELECT * FROM sales
WHERE year = 2008
AND month = 1
AND day = 3
AND region = 'usa';
Beklenen çıktı (budama doğru çalışıyor):
Gather Motion 4:1 (slice1; segments: 4) (cost=0.00..431.00 rows=1 width=24)
-> Sequence (cost=0.00..431.00 rows=1 width=24)
-> Partition Selector for sales (dynamic scan id: 1) (cost=10.00..100.00 rows=25 width=4)
Filter: year = 2008 AND month = 1 AND region = 'usa'::text
Partitions selected: 1 (out of 468)
-> Dynamic Table Scan on sales (dynamic scan id: 1) (cost=0.00..431.00 rows=1 width=24)
Filter: year = 2008 AND month = 1 AND day = 3 AND region = 'usa'::text
Bu planda Partitions selected: 1 (out of 468) ifadesi budamanın etkin olduğunu doğrular. Belirli filtre koşullarına rağmen seçilen yüksek sayıda bölüm görüyorsanız filtre sütununun bölüm anahtarıyla eşleşip eşleşmediğini kontrol edin.
Bölüm tanımlarını sorgulama
Bir tablodaki tüm bölümleri pg_partitions sistem görünümünden sorgulayın:
SELECT
partitionboundary,
partitiontablename,
partitionname,
partitionlevel,
partitionrank
FROM pg_partitions
WHERE tablename='sales';
İlgili işlemler
Bölümleri kaldırma, kısaltma ve değiştirme dahil olmak üzere bölüm yönetimi işlemlerinin tam listesi için bkz. Büyük Tabloları Bölümleme.
SSS
Bölüm anahtarını nasıl seçerim?
Tablonun birincil anahtarı varsa bölüm anahtarı birincil anahtar sütunlarından biri olmalıdır. Birincil anahtar yoksa herhangi bir sütunu bölüm anahtarı olarak belirtebilirsiniz. En iyi budama sonuçları için WHERE yan tümcelerinde en sık görünen sütunu seçin.