21
PARTITIONING İLE VERİ ÖLÇEKLEME Şahap Aşçı @sahapasci [email protected] PGDay - Aralık 2014 06.12.2014 - PGDay - Ankara

PostgreSQL - Inheritance & Partitioning

Embed Size (px)

Citation preview

Page 1: PostgreSQL - Inheritance & Partitioning

06.12.2014 - PGDay - Ankara

PARTITIONING İLE VERİ ÖLÇEKLEME

Şahap Aşçı@sahapasci

[email protected] - Aralık 2014

Page 2: PostgreSQL - Inheritance & Partitioning

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)

Page 3: PostgreSQL - Inheritance & Partitioning

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.

Page 4: PostgreSQL - Inheritance & Partitioning

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

Page 5: PostgreSQL - Inheritance & Partitioning

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) )

Page 6: PostgreSQL - Inheritance & Partitioning

06.12.2014 - PGDay - Ankara

INHERITANCE – ALT TABLO CREATE TABLE buyuk_sehir ( merkez_ilce_sayisi integer ) INHERITS (sehir);

Page 7: PostgreSQL - Inheritance & Partitioning

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);

Page 8: PostgreSQL - Inheritance & Partitioning

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;

Page 9: PostgreSQL - Inheritance & Partitioning

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

Page 10: PostgreSQL - Inheritance & Partitioning

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

Page 11: PostgreSQL - Inheritance & Partitioning

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) )

Page 12: PostgreSQL - Inheritance & Partitioning

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)

Page 13: PostgreSQL - Inheritance & Partitioning

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);

Page 14: PostgreSQL - Inheritance & Partitioning

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");

Page 15: PostgreSQL - Inheritance & Partitioning

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

Page 16: PostgreSQL - Inheritance & Partitioning

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();

Page 17: PostgreSQL - Inheritance & Partitioning

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

Page 18: PostgreSQL - Inheritance & Partitioning

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.

Page 19: PostgreSQL - Inheritance & Partitioning

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 ??

Page 20: PostgreSQL - Inheritance & Partitioning

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

Page 21: PostgreSQL - Inheritance & Partitioning

06.12.2014 - PGDay - Ankara

TEŞEKKÜRLERŞahap Aşçı@sahapasci

[email protected]