postgresql - inheritance & partitioning
TRANSCRIPT
06.12.2014 - PGDay - Ankara
PARTITIONING İLE VERİ ÖLÇEKLEME
Şahap Aşçı@sahapasci
[email protected] - Aralık 2014
06.12.2014 - PGDay - Ankara
PARTITIONING Nedir ?
Fiziksel olarak büyük bir tabloyu sanallaştırarak fiziksel küçük tablolara bölme
Ne yapar ? Tabloları ve Indexleri daha küçük parçalara böler / küçültür
Ne için kullanılır? Belli durumlarda sorgu performansını ciddi şekilde artırır. (SELECT, UPDATE) Büyük parça veriyle işlem yaparken bütüne dokunmadan belli bir tablo
üzerinde çalışma sağlar. (tablo yedekleme / silme) Eski ve erişimi az olan veriler ayrılıp donanım olarak daha ucuz ortamlara
taşınabilir. Nasıl yapılır ? (önce Inheritance)
06.12.2014 - PGDay - Ankara
INHERITANCE Postgres way : Table inheritance Tablodaki yapıyı alt tablolara taşır ve aralarında mantıksal bir
bağlantı oluşturur.
06.12.2014 - PGDay - Ankara
INHERITANCE – ŞABLON Ana tablo oluştur (Şehirler) Alt tablo oluştur (Büyük Şehirler) Veri ekle İncele
Inherit eden özellikler ONLY keyword Tablo sonrası «*» kullanımı sql_inheritance konfigürasyon seçeneği
06.12.2014 - PGDay - Ankara
INHERITANCE – ANA TABLO CREATE TABLE sehir ( id integer NOT NULL, sehir_adi text NOT NULL, ilce_sayisi integer NOT NULL, PRIMARY KEY (id), UNIQUE (sehir_adi) )
06.12.2014 - PGDay - Ankara
INHERITANCE – ALT TABLO CREATE TABLE buyuk_sehir ( merkez_ilce_sayisi integer ) INHERITS (sehir);
06.12.2014 - PGDay - Ankara
INHERITANCE – KAYIT EKLE INSERT INTO sehir VALUES (2, 'Adıyaman', 9); INSERT INTO sehir VALUES (3, 'Afyonkarahisar', 18); INSERT INTO sehir VALUES (4, 'Ağrı', 8);
INSERT INTO buyuk_sehir VALUES (6, 'Ankara', 25, 16); INSERT INTO buyuk_sehir VALUES (34, 'İstanbul', 39, 39); INSERT INTO buyuk_sehir VALUES (35, 'İzmir', 30, 22);
06.12.2014 - PGDay - Ankara
INHERITANCE - İNCELEME SELECT * FROM sehir; SELECT * FROM sehir*; SELECT * FROM ONLY sehir; SELECT * FROM buyuk_sehir; SELECT p.relname, s.*
FROM sehir sINNER JOIN pg_class p ON S.tableoid = p.oid;
06.12.2014 - PGDay - Ankara
SQL_İNHERİTANCE PARAMETRESİ #sql_inheritance = on Yalın tablo isimlerinin nasıl değerlendirileceğini belirtir. on tablo_ismi = tablo_ismi* off tablo_ismi = ONLY tablo_ismi
06.12.2014 - PGDay - Ankara
7 ADIMDA PARTITIONING Ana tabloyu oluştur Alt tabloları oluştur Alt tablolara gerekli CHECK CONSTRAINTS’leri ekle Alt tablolara gerekli INDEX’leri ekle (opsiyonel ?) Ana tabloya trigger / rule ekle (opsiyonel) postgresql.conf içerisindeki «constraint_exclusion» parametresini
kontrol et
INHERITANCE
06.12.2014 - PGDay - Ankara
ANA TABLOYU OLUŞTUR CREATE TABLE cdr ( id serial NOT NULL, tarih date NOT NULL, icerik text NOT NULL, PRIMARY KEY (id) )
06.12.2014 - PGDay - Ankara
ALT TABLOLARI OLUŞTUR CREATE TABLE cdr_alt_1 () INHERITS (cdr) CREATE TABLE cdr_alt_2 () INHERITS (cdr) CREATE TABLE cdr_alt_3 () INHERITS (cdr) CREATE TABLE cdr_alt_4 () INHERITS (cdr)
06.12.2014 - PGDay - Ankara
CHECK CONSTRAINTS’LERİ EKLE ALTER TABLE cdr_alt_1 ADD CONSTRAINT CHECK
(tarih < '2014-04-01'::date); ALTER TABLE cdr_alt_2 ADD CONSTRAINT CHECK
(tarih >= '2014-04-01'::date) AND (tarih < '2014-07-01'::date);
ALTER TABLE cdr_alt_3 ADD CONSTRAINT CHECK (tarih >= '2014-07-01'::date) AND (tarih < '2014-
10-01'::date); ALTER TABLE cdr_alt_4 ADD CONSTRAINT CHECK
(tarih >= '2014-10-01'::date);
06.12.2014 - PGDay - Ankara
INDEX’LERİ EKLE CREATE INDEX ON cdr_alt_1 USING btree ("tarih"); CREATE INDEX ON cdr_alt_2 USING btree ("tarih"); CREATE INDEX ON cdr_alt_3 USING btree ("tarih"); CREATE INDEX ON cdr_alt_4 USING btree ("tarih");
06.12.2014 - PGDay - Ankara
TRIGGER EKLE -1CREATE OR REPLACE FUNCTION public.cdr_tr_fn ()RETURNS trigger AS$body$BEGIN IF (NEW.tarih < '2014-04-01') then insert into yeni.cdr_alt_1 values (new.*); ELSEIF (NEW.tarih >= '2014-04-01'::date) AND (NEW.tarih < '2014-07-01'::date) THEN insert into yeni.cdr_alt_2 values (new.*); ELSEIF (NEW.tarih >= '2014-07-01'::date) AND (new.tarih < '2014-10-01'::date) THEN insert into yeni.cdr_alt_3 values (new.*); ELSEIF(NEW.tarih >= '2014-10-02'::date) THEN insert into yeni.cdr_alt_4 values (new.*); ELSE RAISE EXCEPTION 'Date out of range. Fix the cdr_tr_fn() function!'; END IF; RETURN NULL;END;$body$LANGUAGE 'plpgsql';
06.12.2014 - PGDay - Ankara
TRIGGER EKLE -2 CREATE TRIGGER cdr_tr BEFORE INSERT ON cdr FOR EACH ROW EXECUTE PROCEDURE public.cdr_tr_fn();
06.12.2014 - PGDay - Ankara
CONSTRAİNT_EXCLUSİON PARAMETRESİ#constraint_exclusion = partition # on, off, or partitionQuery planner’ın queryleri optimize etmesi için table constraint’lerini kontrol edip etmemesini ayarlaron her zaman kontrol etoff hiçbir zaman kontrol etmepartition yalnızca inherit edilmiş tablolarda ve UNION ALL sorgularında kontrol et
06.12.2014 - PGDay - Ankara
HATIRLATMALAR -1 Örnekte yaptığımız Range Partitioning’di. Bir de List Partitioning var. Neden rule kullanmadık?
Yalnızca bulk veri insert ederken Rule, Triggerdan hızlıdır. (query başına yük) COPY komutu Rule’u atlar. Rule üzerine raise error yapamazsınız.
Trigger & Rule kullanmadan uygulama üzerinden direk alt tablolara veri basarak veri dağıtımı yapılabilir.
SELECT sorgusu direk alt tablolara yapılabilir. Kayıtları güncellerken partition yaptığınız alanın güncellenmesi durumunun
düşünülmesi gerekir. Eğer partition yaptığınız alanı kullanmadan başka alanlar üzerinden sorgularınız
varsa genel performans düşebilir. Foreign Key’lerden vazgeçmek zorunda kalabilirsiniz.
06.12.2014 - PGDay - Ankara
HATIRLATMALAR -2 Vacuum / Analyze gibi komutlar fiziksel tabloyu parametre alırlar;
Ana tabloyu vacumladığınızda alt tablolara etkisi olmaz. «select * from cdr where tarih = CURRENT_DATE» veya «select *
from cdr where tarih = a_function()» gibi sorgularda query planner fonksiyonun sonucunun ne olduğunu bilemeyeceği için tüm alt tabloları tarar.
Alt tabloları da başka alt tablolara bölebilirsiniz. Partition sayısı arttıkça query plannerın hesap süresi uzar. (100-
200 partition sorun çıkarmaz, 1000’den fazla partition’a bölmeyin )
Partial Indexes ??
06.12.2014 - PGDay - Ankara
REFERANSLAR PostgreSQL 9.3.5 Documentation
II. The SQL Language Chapter 5. Data Definition
5.8. Inheritance 5.9. Partitioning
III. Server Administration Chapter 18. Server Configuration
18.7. Query Planning constraint_exclusion
18.13. Version and Platform Compatibility sql_inheritance