PostgreSQL Partition Nedir? Kullanımı

Paylaş

PostgreSQL performans artırma işlemi sırasında kullanılan PostgreSQL Partition nedir ile bölümleme anlatılarak partition kullanımı çeşitli örnekler verilmiştir.

Partition Nedir?

PostgreSQL ve gelişmiş VTY sistemlerinde kullanılan partition kelimesini bölme, ayırma olarak çevirebiliriz.

Veri tabanı tasarımı sırasında yapılan normalizasyon ve index düzenlemesi ne kadar iyi olursa olsun yüksek boyutlu veriler bir süre sonra yavaşlamaya başlayacaktır.

Verilerin yavaşlamasını önlemek için partition ve dağıtık PostgreSQL sunucuları kullanılabilir.

Partition kavramını işletim sistemlerindeki sürücü bölümlemeye benzetebiliriz.

Partition özelliği kullanarak verilerin belirli bölümleri fiziksel olarak parçalara ayrılır.

Örneğin; Ürün bilgilerinin bulunduğu urunler tablosundaki ilk 1000 kayıt birinci bölümde, ikinci 1000 kayıt ikinci bölümde gibi bölümlere ayırabiliriz.

Benzer şekilde işlem yoğunluğuna göre tarih işlemlerini yıllara, aylara ve günlere göre ayırabiliriz.

Partition özelliği sadece sayısal verileri içeren veya sayısal veriye çevrilebilen sütunlarda kullanılır.

Özetle; PostgreSQL’de “partitioning” (bölümlendirme), büyük veritabanı tablolarını daha küçük, yönetilebilir parçalara bölerek performans artırarak bakımı kolay hale getirip veritabanının daha etkin kullanılmasını sağlar.

Partition kullanımı

Partition yatay ve dikey olmak üzere ikiye ayrılır.

Partition türleri VTYS göre desteği farklılık gösterir.

PostgreSQL sadece yatay bölümlemeyi desteklemektedir.

Bölümleme veri tabanı tasarımı sırasında yapılacağı gibi sonradan da yapılabilir.

Partition türleri RANGE, LIST, HASH ve Table Partition olmak üzere dört bölümden oluşur.

RANGE: Sütunu belirli bir aralığa göre bölümlemek için kullanılır.

CREATE TABLE urunler (
  urun_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
) PARTITION BY RANGE(urun_id);

CREATE TABLE urunler_p0 PARTITION OF urunler
  FOR VALUES FROM (MINVALUE) TO (1000);

CREATE TABLE urunler_p1000 PARTITION OF urunler
  FOR VALUES FROM (1000) TO (2000);

CREATE TABLE urunler_p2000 PARTITION OF urunler
  FOR VALUES FROM (2000) TO (3000);

CREATE TABLE urunler_p3000 PARTITION OF urunler
  FOR VALUES FROM (3000) TO (4000);

CREATE TABLE urunler_p4000 PARTITION OF urunler
  FOR VALUES FROM (4000) TO (MAXVALUE);

Oluşturulan bölümler (partition) ile ilgili bilgiye

EXPLAIN SELECT * FROM urunler;

veya

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='urunler';

komutu ile ulaşabilirsiniz.

LIST: Sütunu belirli değere göre bölümlemek için kullanılır.

CREATE TABLE urunler (
  urun_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
) PARTITION BY LIST(urun_id);

CREATE TABLE urunler_p0 PARTITION OF urunler
  FOR VALUES IN (1, 2, 5);

CREATE TABLE urunler_p1 PARTITION OF urunler
  FOR VALUES IN (3, 4);

CREATE TABLE urunler_p2 PARTITION OF urunler
  FOR VALUES IN (9, 6);

CREATE TABLE urunler_p3 PARTITION OF urunler
  FOR VALUES IN (7, 8);

Komut sonucunda urunler_p0 bölümünde urun_id değeri 1, 2 ve 5 olan değerler saklanacak urunler_p1, urunler_p2, urunler_p3 değerleri de benzer şekilde parantez içerisine yazılan değerleri saklayacaktır.

HASH: PostgreSQL bölümlemeyi özel algoritmik ifadeye göre yapar.

DROP TABLE IF EXISTS urunler;
CREATE TABLE IF NOT EXISTS urunler (
  urun_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
) PARTITION BY HASH(urun_id);

CREATE TABLE urunler_p0 PARTITION OF urunler
  FOR VALUES WITH (MODULUS 5, REMAINDER 0);

CREATE TABLE urunler_p1 PARTITION OF urunler
  FOR VALUES WITH (MODULUS 5, REMAINDER 1);

CREATE TABLE urunler_p2 PARTITION OF urunler
  FOR VALUES WITH (MODULUS 5, REMAINDER 2);

CREATE TABLE urunler_p3 PARTITION OF urunler
  FOR VALUES WITH (MODULUS 5, REMAINDER 3);

CREATE TABLE urunler_p4 PARTITION OF urunler
  FOR VALUES WITH (MODULUS 5, REMAINDER 4);

HASH bölümleme (partition) sonrasında HASH ile belirtilen alan (urun_id) değerine göre bölümleme HASH algoritması kullanılarak yapılır.

Table Partition: Ana tabloya benzer alt tablolara oluşturmak için kullanılır.

DROP TABLE IF EXISTS urunler CASCADE;
CREATE TABLE IF NOT EXISTS urunler (
  urun_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  urun_adi VARCHAR(255) NOT NULL,
  urun_fiyat DECIMAL(10,0) NOT NULL,
  kat_id INT NOT NULL
);
CREATE TABLE elektronik() INHERITS (urunler);
CREATE TABLE bilgisayar() INHERITS (urunler);
CREATE TABLE diger() INHERITS (urunler);

Komut sonucunda urunler ana tablosu oluşturulduktan sonra elektronik, bilgisayar ve diger tabloları ana tablodan kalıtım alınarak alt tablolar oluşturulur.

Bölümleme işlemleri yapılsa da iyi bir sorgu oluşturulmamışsa performans artışı olmayabilir.

Performans artışı için sorgu ifadelerinde bölümleme işleminin yapıldığı sütun ile yapılabilir.

SELECT * FROM urunler WHERE urun_id < 250;

Benzer şekilde sorgularda ilk arama kriteri olarak bölümlenen sütun adının yazılması etkili olacaktır.

SELECT * FROM urunler WHERE urun_id < 1000 AND urun_adi = 'PostgreSQL Kitabı';

Bölümleme sonrasında PostgreSQL ile performans denemeleri ve analizi yaparak en uygun bölümleme türü seçilmelidir.

EXPLAIN SELECT * FROM urunler;

Ayrıca bölümleme için optimizasyon komutları da ANALYZE, VACUUM FULL, REINDEX TABLE kullanılır.

PostgreSQL Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir