PostgreSQL JSONB ‘de Partitioning Mimarisi

PostgreSQL de JSON datayı saklamak için JSON ve JSONB veri tipleri mevcuttur. Json veriyi string olarak saklar ve her sorguda parse işlemini gerçekleştirir.
JSONB ise json ‘ı parse edip binary formatta saklanmasını sağlamaktadır. Bu tarz kolonlarda yazma hızı yavaş olur fakat okuma hızı oldukça hızlıdır.

JSON, web uygulamaları, JavaScript ve REST tabanlı mobil uygulama geliştirenler için vazgeçilmez bir dil hatta eskilerin deyimiyle sabir dil (lingua franca: geçerli dil, ortak dil) durumunda. 9.4 sürümünde ise JSON’ın binary sürümü olan jsonb veri tipi desteği gelmişti.

Bu aşamaya kadar JSON ve JSONB veri tiplerini anlamaya çalıştık. Peki Jsonb olarak tuttuğumuz verileri nasıl partition yaparız sorususunun cevabını uygulamalı olarka bu makale de ele alıyor olacağız.

-- Tablomuzu oluşturalım.
CREATE TABLE jsonBDemo (data jsonb) partition by range ((data->'id'));

-- Partition larımızı belirliyoruz.

CREATE TABLE jsonBDemo_01 PARTITION OF jsonBDemo
 FOR VALUES FROM ('1') TO ('10');

CREATE TABLE jsonBDemo_02 PARTITION OF jsonBDemo
 FOR VALUES FROM ('11') TO ('20');

CREATE TABLE jsonBDemo_03 PARTITION OF jsonBDemo
 FOR VALUES FROM ('21') TO ('30');

CREATE TABLE jsonBDemo_04 PARTITION OF jsonBDemo
 FOR VALUES FROM ('31') TO ('40');

--Partition larmızı index liyoruz.
CREATE INDEX ON jsonBDemo_01 USING BTREE ((data->'id'));
CREATE INDEX ON jsonBDemo_02 USING BTREE ((data->'id'));
CREATE INDEX ON jsonBDemo_03 USING BTREE ((data->'id'));
CREATE INDEX ON jsonBDemo_04 USING BTREE ((data->'id'));

-- Demo datamızı insert ediyoruz.
INSERT INTO jsonBDemo (data) VALUES ('{"id":11,"title": "Sleeping Beauties", "genres": ["Fiction", "Thriller", "Horror"], "published": false}');  
INSERT INTO jsonBDemo VALUES ('{"id":34,"title": "Influence", "genres": ["Marketing & Sales", "Self-Help ", "Psychology"], "published": true}');  
INSERT INTO jsonBDemo VALUES ('{"id":41,"title": "The Dictator''s Handbook", "genres": ["Law", "Politics"], "authors": ["Bruce Bueno de Mesquita", "Alastair Smith"], "published": true}');  
INSERT INTO jsonBDemo VALUES ('{"id":16,"title": "Deep Work", "genres": ["Productivity", "Reference"], "published": true}');  
INSERT INTO jsonBDemo VALUES ('{"id":22,"title": "Siddhartha", "genres": ["Fiction", "Spirituality"], "published": true}');  

Dataya Select çekiyoruz.

demo=# select * from jsonbdemo;
demo=# explain analyze select * from jsonbdemo where data->'id'='22';

Analyze Sonucu :

 Append  (cost=3.21..12.05 rows=7 width=32) (actual time=0.013..0.013 rows=1 loops=1)
   ->  Bitmap Heap Scan on jsonbdemo_03  (cost=3.21..12.02 rows=7 width=32) (actual time=0.012..0.012 rows=1
 loops=1)
         Recheck Cond: ((data -> 'id'::text) = '22'::jsonb)
         Heap Blocks: exact=1
         ->  Bitmap Index Scan on jsonbdemo_03_expr_idx  (cost=0.00..3.21 rows=7 width=0) (actual time=0.008
..0.008 rows=1 loops=1)
               Index Cond: ((data -> 'id'::text) = '22'::jsonb)
 Planning Time: 0.348 ms
 Execution Time: 0.145 ms
(8 rows)

Yukarıda da görüldüğü üzere 3. partition üzerinde ki index ‘i kullanmakta query miz.

Bu şekilde jsonb içeriisnde tuttuğumuz verileride partition yapmış bulunmaktayız.

Kolay Gelsin

Leave a Reply

Your email address will not be published. Required fields are marked *