postgres partitioning
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 ;