Tüm Ürünler
Search
Belge Merkezi

AnalyticDB:Bölümlenmiş tabloları tanımlama

Son Güncelleme:Oct 05, 2026

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 WHERE yan 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. WHERE yan 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 DELETE deyimi ç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: year sütununa göre aralığa göre bölümlenir

  • Düzey (alt bölüm): month sütununa göre aralığa göre bölümlenir

  • Düzey (alt bölüm): region sü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.

  • AT yan 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.