PostgreSQL Range Partition

PostgreSQL Range Partition (Aralık Bölümleme), bir tabloyu belirli bir aralığa göre fiziksel olarak bölmenizi sağlayan bir veri yönetimi yöntemidir. Bu bölme yöntemi, genellikle büyük veri kümelerini daha küçük ve yönetilebilir parçalara bölmek için kullanılır. Aralık bölümlemesi genellikle zaman serisi verileri veya sıklıkla sorgulanan aralıklarla ilişkili verilerin saklanması için idealdir.

PostgreSQL  Range Partition ile ilgili temel bilgiler:

Aralık Belirleme: Range partition, bir tabloyu belirli bir aralığa göre bölmenizi sağlar. Örneğin, tarih sütununa göre bir tabloyu yıllara, aylara veya haftalara göre bölebilirsiniz. Bu, verileri belirli zaman dilimlerine göre daha küçük parçalara ayırarak sorgulamayı ve yönetmeyi kolaylaştırır.

Bölme Sınırları: Her bölmenin sınırları önceden belirlenir. Örneğin, bir tabloyu yıllara göre bölüyorsanız, her bölme bir yılın başlangıç ve bitiş tarihlerine sahip olacaktır. Veriler, bu sınırlar içindeki zaman aralıklarına göre bölünür.

Performans ve Yönetim Kolaylığı: Range partition, büyük veri kümelerini daha küçük parçalara böldüğü için sorgulama performansını artırabilir. Ayrıca, verileri mantıksal olarak bölerek veri yönetimini ve yedeklemeyi kolaylaştırır.

Partition İşlemleri: Range partition, verileri aralıklara göre otomatik olarak yönlendirir. Yeni veri eklendiğinde veya mevcut veri güncellendiğinde, PostgreSQL otomatik olarak doğru bölüme ekler veya mevcut bölümdeki veriyi günceller.

Sorgulama Optimizasyonu: Range partition, sorguların belirli aralıklara odaklanmasını sağlar. Özellikle belirli zaman aralıklarındaki verilere sık sık erişiliyorsa, veri erişimini hızlandırabilir.

Range partition, PostgreSQL’in veri yönetimini ve performansını artırmak için güçlü bir araçtır. Özellikle zaman serisi verileri veya kronolojik olarak sıralı verileri saklamak için idealdir. Ancak, bölme stratejisinin dikkatlice belirlenmesi ve bölme sınırlarının doğru yapılandırılması önemlidir.

Partition ile ilgili bilgi almak için Partition Nedir yazıma göz atabilirsiniz.

Range Partition örneğimize geçelim:

İlk olarak yeni bir tablo oluşturuyoruz.

 CREATE TABLE odemeler_part (
    id SERIAL,
    isim VARCHAR(100),
    odeme_tutari NUMERIC(10, 2),
    odeme_zamani TIMESTAMP,
    PRIMARY KEY (id, odeme_zamani)
) PARTITION BY RANGE (odeme_zamani);

Oluşturulan tabloda da primary key olmak zorunda .

Partition oluştururken odeme_zamanı kolonundaki verilere göre oluşturmamız gerekiyor. Partition oluştururken isterseniz günlük,aylık,yıllık … gibi yapabilirisiniz en çok tercih edilen aylık partitiona göre tablolarımızı oluşturalım.

CREATE TABLE odemeler_2023_01 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-01-01') TO ('2023-02-01');

CREATE TABLE odemeler_2023_02 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-02-01') TO ('2023-03-01');

CREATE TABLE odemeler_2023_03 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-03-01') TO ('2023-04-01');

CREATE TABLE odemeler_2023_04 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-04-01') TO ('2023-05-01');

CREATE TABLE odemeler_2023_05 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-05-01') TO ('2023-06-01');

CREATE TABLE odemeler_2023_06 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-06-01') TO ('2023-07-01');

CREATE TABLE odemeler_2023_07 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-07-01') TO ('2023-08-01');

CREATE TABLE odemeler_2023_08 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-08-01') TO ('2023-09-01');

 CREATE TABLE odemeler_2023_09 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-09-01') TO ('2023-10-01');

 CREATE TABLE odemeler_2023_10 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-10-01') TO ('2023-11-01');

CREATE TABLE odemeler_2023_11 PARTITION OF odemeler_part
    FOR VALUES FROM ('2023-11-01') TO ('2023-12-01');

Yukarıda görüldüğü gibi her ay için bir tablo oluşturduk.


Oluşturduğumuz partitionlar için aşağıdaki scripti kullanabilirsiniz.

SELECT
    nmsp_parent.nspname AS parent_schema,
    parent.relname      AS parent,
    nmsp_child.nspname  AS child_schema,
    child.relname       AS child
FROM pg_inherits
    JOIN pg_class parent            ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child             ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
    JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace
WHERE parent.relname='odemeler_part';

Oluşturduğumuz partitionlar tablomuza eklenmiş .

Loading