postgres partitioning

İbrahim Yıldız
2 min readSep 19, 2023

Herkese merhabalar bugün ki konumuz postgresql’de partitioning nedirden başlayaıp nasıl yapılır türleri ve otomatik partition aracına varana kadar detaylıca yazmayı planlıyorum hadi başlayalım :)

Partitioning nedir

postgreSQL’de “partitioning” veya “bölmeleme,” büyük veritabanı tablolarını daha verimli bir şekilde yönetmek için kullanılan bir veritabanı tasarım tekniğidir. Bu tekniği kullanarak büyük bir tabloyu daha küçük, daha yönetilebilir parçalara bölersiniz ve bu parçaları önceden belirlenmiş bir bölmeleme anahtarı (partitioning key) temelinde oluşturursunuz. Her bölme (partition), mantıksal olarak ayrı bir tablo gibidir, ancak bunlar birbiriyle mantıksal olarak ilişkilendirilmiştir ve büyük veri kümesini daha kolay yönetmenizi ve sorgulamanızı sağlar.

Partitioning avantajları:

  • Sorgu performansının artırılması: Büyük bir tabloyu bölmek, sorgularda taranması gereken veri miktarını azaltabilir.
  • Bakımın kolaylaştırılması: Bölmeleme, büyük tablolar için veri arşivleme, silme ve yedekleme işlemlerini basitleştirir.
  • Paralel işleme: Sorgu yürütme, bölümler arasında paralelleştirilebilir ve sorgu performansını artırabilir.

Partitioning tipleri

range:tabloyu belirli aralıklara bölme. 1–5 arası gibi

list : listeme olarak bir harfe göre, bir türe göre olabilir, kategoriye göre olabilir vss.

hash : verileri hashleyip farklı farklı yerelere atıyor big data tarafında kullanılıyor

Yaratırken öncellike root table yani neye göre bölümleyeceğiz sonra child partititon ekliyoruz

RANGE PARTITON

CREATE TABLE borclar(

borc_id integer PRIMARY KEY ,
tutar integer,
odeme_tarihi timestamp

) PARTITION BY RANGE (odeme_tarihi) // ödeme tarihine göre bölümleyeceğiz

//child tablolarımız yaratıyoruz

CREATE TABLE borc_2018_2020 PARTITION OF borclar FOR VALUES FROM('2018-01-01')
TO('2020-01-01')

FROM : başlangıç zamanı

TO : bitiş kısmı to ama bitiş dahil değil 2020–01–01 < 2019–12–30 : 23.59'a kadar yazar

LIST PARTITION

CREATE TABLE magazalar(

magaza_id integer PRIMARY KEY ,
tutar integer,
kapanıs_saati timestamp
magaza_sehir varchar(30)

) PARTITION BY LIST(magaza_sehir) // ödeme tarihine göre bölümleyeceğiz

//child tablolarımız yaratıyoruz

CREATE TABLE magaza_a PARTITION OF magazalar FOR VALUES IN
('Ankara','Adana','Aydın','Ağrı','Amasya')

CREATE TABLE magaza_b PARTITION OF magazalar FOR VALUES IN
('Bolu','Bursa','Balıkesir','Bilecik','Bingök','Burdur')

HASH PARTITION

CREATE TABLE hash_part(id int) PARTITION by HASH(id)


CREATE TABLE hash_part_1 PARTITION OF HASH hash_part
FOR VALUES WITH (MODULUS 2 REMAINDER 0)

CREATE TABLE hash_part_1 PARTITION OF HASH hash_part
FOR VALUES WITH (MODULUS 2 REMAINDER 1)


MODULUS : 2 'YE BÖLÜCEK
REMAINDER : KALAN 0 İSE TABLODA TUTULSUN

PARTITION INDEX

root tablolarda index : evet partititonlarda index oluşturabiliriz ,root partition oluşturduğumuz indexler child tablolarda da geçerli oluyor tek tek ayrı oluşturmuyorusunuz

child tablolarda index : root partittion zaten oluşturuyordu ama özel index yaratmak isterseniz oluşturabilirsiniz

PG_PARTMAN

Kısacası otomatik partititon table yaratmamıza olanak sağlayan extension otomatik olarakta partition silebilir :)

CREATE SCHEMA test_partman
CREATE EXTENSION pg_partman SCHEMA test_partman
CREATE ROLE test_partman WITH LOGIN
GRANT ALL ON test_partman SCHEMA TOtest_partman
GRANT ALL ON ALLtest_partman TABLE IN SCHEMA TO test_partman
GRANT ALL ON SCHEMA test_partman TO test_partman

CREATE TABLE test(a int) SELECT now() + round(random()*10000)
SELECT gbd_partman.create_parent('public'.test.1,'a1','native','monthly',
p_start_partition := '2024-01-01')

Default Partitioning Nedir

Gelen verileriniz partiton key alanıyla eşleşmiyorsa gelen veriniz için partition oluşmamışsa default partititon key yazmak anlamındadır tabii ki önerilmiyor kesinlikle ciddili performans kayıplarına neden olur!!

CREATE TABLE giderlerim_partition PARTTION OF giderler DEFAULT ;

--

--

No responses yet