Al DjangoVillage di Orvieto 2014, ha partecipato il nostro Matteo Durighetto, area DB di Miriade e vicepresidente ITPUG, con un intervento sulle ultime novità di PostgreSQL 9.4. In queste slide verrano esposte le feature maggiori di PostgreSQL 9.3 come la cascanding replication con il remastering, le updatable view, il parallel pg dump e i nuovi costrutti di query come i lateral join ma l’attenzione si focalizza sulle nuove feature che porterà con sè la nuova versione 9.4.
Sono state esposte le feature maggiori di PostgreSQL 9.3 come la cascanding replication con il remastering, le updatable view, il parallel pg dump e i nuovi costrutti di query come i lateral join ma l’attenzione si è focalizzata sulle nuove feature che porterà con sè la nuova versione 9.4.
1. PostgreSQL 9.3 & 9.4
Matteo Durighetto
Italian PostgreSQL Users Group
www.itpug.org www.postgresql.org
Matteo Durighetto - m.durighetto@miriade.it - ITPUG.org
2. Chi sono?
● Speaker/Author:
o Matteo Durighetto
o DBA @ Miriade S.p.A.
o tecnologie db: Oracle, PostgreSQL, MySQL, MSSQL ..
o tecnologie os/virtual/cloud: AWS, Vmware,XEN, Linux, *NIX,
Windows
o Membro e Vice Presidente ITPUG
Copyright 2012 Miriade S.p.a.Copyright 2012 Miriade S.p.a.
Matteo Durighetto - m.durighetto@miriade.it - ITPUG.org
WHOAMI ;
3. Chi sono?
● PostgreSQL 9.3 è alla 9.3.4 ( 4 patch minor ) , stable
● PostgreSQL 9.4 è alla fase di beta 1, non è stable, ma è possibile già
testare i vostri software con la versione per comprenderne le potenzialità
per testare PostgreSQL 9.4 beta su Debian 7:
deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main 9.4
Copyright 2012 Miriade S.p.a.Copyright 2012 Miriade S.p.a.
Matteo Durighetto - m.durighetto@miriade.it - ITPUG.org
Stato attuale sviluppo
4. PostgreSQL 9.3
● Più User Friendly
● Più Pluggable
● Più Potente
● Più Automazione
● Più Sicuro
● Più veloce nel backup logico
● Più veloce il failover
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
5. ● Più Facile
1. Pg 9.3 non necessita più la configurazione del SHMMAX, usa ora un’area
di 68kb con il System V ipc, mentre il restante della shared memory è
gestita tramite Posix & mmap ipc.
2. Remastering Standby, lo fa automaticamente non necessita la
ricostruzione dello standby o manualmente la copia degli archivelog o
repmgr:
1. pg_basebackup -r : per preparare un config file dello standbym.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
6. ● Più Pluggable
1. Foreign data wrapper in scrittura e lettura: si può integrare con vari
database (mssql, oracle, mondodb..) o vari servizi in modo trasparente
(ldap, twitter.. ) in modo tale da poter scrivere o leggere da varie fonti dati
come se fossero tabelle locali.
1. JSON: in 9.2 Pg aveva il datatype, adesso ha metodi di estrazione del
valore o convertire il valore in array e viceversa ( JSON_EACH ):
http://www.postgresql.org/docs/9.3/static/functions-json.html
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
7. ● Più Pluggable
1. Background Worker: possibilità di creare un background worker che può
accedere alla shared memory ed eseguire una serie di transazioni. Per
esempio si può scrivere un processo che analizza l’efficienza degli indici e
li ricostruisce poi oppure per accedere ad un’altra tipologia di database:
https://github.com/umitanuki/mongres
● Più Potente
1. Updatable View: le view “semplici” sono aggiornabili.
2. Lateral JOIN: una subquery può richiamare un oggetto
di un’altra subquery
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
8. ● Più Potente
1. SELECT base.nr,
multiples.multiple
FROM (SELECT generate_series(1,10) AS nr) base,
LATERAL (
SELECT multiples.multiple FROM
( SELECT generate_series(1,10) AS b_nr, base.nr * 2 AS multiple ) multiples
WHERE multiples.b_nr = base.nr
) multiples;
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
9. ● Più Automazione
1. Materialized view: Potete creare una view con un segmento di appoggio di
cui potete far refresh.
1. DDL trigger / EVENT TRIGGER: potete automatizzare degli event dopo un
evento DDL ( DDL_COMMAND_START / DDL_COMMAND_STOP ).
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
10. ● More Secure
1. Data Page Checksum: permette il riscontro di problematiche di corruzione
tramite il calcolo del page checksum (8k). Necessità di essere inizializzato
al momento della creazione del cluster.
initdb --data-checksums
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
11. ● Faster Dump
1. Parallel Dump: l’estrazione parallela permette di evitare costose gestioni
via script o altro ( è necessario abilitarla)
pg_dump -Fd -j number_of_processes
● Faster Failover
1. Il Failover è meno di un secondo.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
12. PostgreSQL 9.4
1. Alter system set ..
2. Huge Page
3. Refresh concurrently materialized view
4. Replication slot
5. Logical decoding
6. Alter tablespace move
7. Hypothetical rank & agg function
8. Aggregazione ordinata & filtrata
9. Updatable view con CHECK
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
14. ● 1) ALTER SYSTEM SET
E’ ora possibile modificare un parametro del postgresql.conf col comando alter
system set .
esempio :
alter system set huge_pages=on;
genera o modifica un file chiamato postgresql.auto.conf all’interno della
PG_DATA, commentando i relativi parametri sul postgresql.conf. Al
riavvio/reload prenderà le modifiche rispetto allo standard.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
15. ● 1) ALTER SYSTEM SET
Esempio sulla work mem :
alter system set work_mem=10M ;
select pg_reload_conf();
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
16. ● 2) HUGE Page
huge page => 2mb vs 4kb ( sistemi x86 , su Itanium son 16mb etc )
1. Permettono di mappare aree più vaste di shared memory con minori
puntatori nella cache TLB della cpu, diminuisce quindi l’uso della cpu nel
look up della pagina.
2. Le huge page non possono swappare.
3. Se si pone il parametro huge_pages a TRY ,alla partenza prova ad allocare
le pagine ma in caso switcha a paine normali, se si pone ad ON e le pagine
non sono sufficienti, il postgresql non parte.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
17. ● 2) HUGE Page
1. impostazione 20GB huge pages:
2. /etc/sysctl.conf aggiungere vm.nr_hugepages=5000
3. sysctl -p
4. alter system set huge_pages = ‘on’ ## se si vuole forzarle, default è TRY
5. pg_ctl reload -D $PG_DATA o service postgresql reload ## debian
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
18. ● 3) Refresh Materialized View concurrently
1. creazione indice univoco sulla materialized view .
2. REFRESH MATERIALIZED VIEW nomeview CONCURRENTLY ;
In questo modo le query sulla materialized view non vengono bloccate.
Come avviene ? tramite un delete della tabella della materialized view e un
inserimento del risultato della query.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
19. ● 3) Refresh Materialized View concurrently
Unendo questo tipo di refresh ai trigger si può ottenere un refresh on commit
(per il caso di truncate, se contemplato va aggiunto un altro trigger ) :
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
20. ● 4) Replication Slot
Problema: se lo standby è stato posto in fase di maintenance, quando lo
riattiverete è possibile che il master abbia esaurito il numero di checkpoint
segment della ritenzione :
1) ripristinate i checkpoint segment mancanti sullo standby nella directory
archive
2) ricostruite lo standby
Dalla 9.4 non serve più perchè potete creare il replication slot
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
21. ● 4) Replication Slot
creazione slot di replicazione [ N.B. manterrà i checkpoint segment necessari
nella XLOG ! ]:
select pg_create_physical_replication_slot('slot01');
verifica:
SELECT * FROM pg_replication_slots;
aggiungere nel recovery.conf : primary_slotname = ‘slot01’
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
22. ● 4) Replication Slot
creazione slot di replicazione :
select pg_create_physical_replication_slot('slot01');
verifica:
SELECT * FROM pg_replication_slots;
aggiungere nel recovery.conf : primary_slotname = ‘slot01’
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
23. ● 5) Logical Decoding
Gli slot possono essere associati ad un replica logica tramite plugin
(test_deconding):
select pg_create_logical_replication_slot(‘logslot01’,’test_deconding’);
una volta creato lo slot che viene associato ad un db, si può procedere
all’estrazione delle informazioni dal xlog.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
24. ● 5) Logical Decoding
Visione delle informazioni :
select pg_logical_slot_peek_changes(‘logslot0’,NULL,NULL);
Estrazione delle informazioni e pulizia coda :
select pg_logical_slot_get_changes(‘logslot0’,NULL,NULL);
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
25. ● 5) Logical Decoding
Esempio di return del dato ( N.B. attualmente non traccia le DDL ! ) :
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
SCN/XID Numero transazione Istruzione DML
26. ● 5) Logical Decoding
Formato DML ( per il plugin test_decoding ) :
“tipologia_oggetto schema.nomeoggetto: DML: nomecolonna[tipologia
colonna]: valore “
ovviamente si possono avere concatenati più:
nomecolonna1[tipologia colonna1]: valore1 nomecolonna2[tipologia colonna2]:
valore2 nomecolonna3[tipologia colonna3]: valore3 … nomecolonnaN[tipologia
colonnaN]: valoreN
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
27. ● 6) Alter tablespace move
Dalla 9.4 è possibile muovere tutti gli oggetti da una tablespace ad un’altra dello
stesso cluster. Attenzione: è single thread.
ALTER TABLESPACE name MOVE { ALL | TABLES | INDEXES |
MATERIALIZED VIEWS } [ OWNED BY role_name [, ...] ] TO new_tablespace [
NOWAIT ]
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
28. ● 7) Hypothetical Aggregate Function
select RANK(200) WITHIN GROUP ( ORDER BY x ) from ( values (
0),(10),(20),(100),(500),(5),(100) ) t(x) ;
permettono il calcolo di rank o dense_rank etc di un valore ipotetico rispetto
all’ordinamento di una colonna ed un set di valori derivanti da una tabella o da
una collezione di valori.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
29. ● 7) Hypothetical Aggregate Function
tips : creare indice su colonna ordinate
create index idx01_t1 on t1(x);
select RANK(100) WITHIN GROUP ( ORDER BY x ) from t1 ;
⇒ sequential scan della tabella
select RANK(100) WITHIN GROUP ( ORDER BY x ) from t1 where x <=100 ;
⇒ index only scan con filtro
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
30. ● 8) Aggregazione ordinata e filtrata
select paese, sum(produzione),sum(produzione) FILTER ( where
tipo_produzione=1 ), sum(produzione) FILTER ( where tipo_produzione=2 )
from fact01 group by paese ;
Con l’opzione FILTER è possibile filtrare la funzione aggregato relativa solo al
calcolo di quel campo, evitando i case etc.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
31. ● 8) Aggregazione ordinata e filtrata
Funzioni :
mode() => valore più frequente
percentile_disc() => calcolo il percentile restituendo il valore discreto della
popolazione
percentile_cont() => fa una interpolazione lineare e restituisce il valore ipotetico
che rappresenta il percentile relativo alla popolazione
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
32. ● 8) Aggregazione ordinata e filtrata
Sintassi :
SELECT sito, percentile_disc(0.4) WITHIN GROUP (ORDER BY prod)
from fact01 group by sito;
ovviamente possia combinare le opzioni :
SELECT sito, percentile_disc(0.4) WITHIN GROUP (ORDER BY prod)
FILTER ( WHERE tipoproduzione=1 )
from fact01 group by sito;
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
33. ● 9) Updatable view con CHECK
Si può ora definire una view updatabile con controlli sulla where condition , in
modo tale che gli update non vadano a violare tali condizioni :
create view vx as
select id_prodotto, sum(quantita), avg(costo), sum (quantita*costo) as totale
from
fact01
where id_prodotto is not null
WITH CHECK OPTION;
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
34. ● 10) UNNEST
Possiamo fare l’unnesting degli array es. se definiamo una tabella t3( id int, b
int[]) :
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
35. ● 11) PL/PGSQL stack trace
CREATE FUNCTION teststack() RETURNS integer AS $$
DECLARE
stack text ;
BEGIN
GET DIAGNOSTICS stack = PG_CONTEXT ;
RAISE NOTICE E'--- Call Stack ---n%', stack ;
RETURN 1 ;
END;
$$ LANGUAGE plpgsql ;
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
36. ● 11) PL/PGSQL stack trace
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
Identifica la riga della
funzione che ha dato
eccezione
37. ● 12) JSONB
Introdotto un nuovo formato binario del JSON , denominato JSONB, più
efficiente nello storing del dato. Infatti il json veniva storato come una stringa,
mentre il jsonb è di tipo binario.
Sono state inoltre introdotte una serie di funzioni relative al jsonb e una serie di
operatori .
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
38. ● 12) JSONB
tipo dato :
‘{“key1”:”value”,”key2”:valuenumber, .. }’::jsonb
operatori :
-> estrae l’array o la chiave
- -> estrae l’array o la chiave in formato testo senza apici “
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
40. ● 12) JSONB
regole di filtro :
jsonb1 @> jsonb2 => jsonb1 contiene jsonb2
jsonb1 <@ jsonb2 => jsonb2 contiene jsonb1
jsonb1 = jsonb2 => jsonb1 = jsonb2
jsonb1 ? key => la chiave esiste nel jsonb1 ?
jsonb1 ?| array[key1,key2] => una delle chiavi esiste nel jsonb1 ?
jsonb1 ?& array[key1,key2] => tutte le chiavi esistono nel jsonb1 ?
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
41. ● 12) JSONB
possibilità di indicizzarli coi gin :
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
42. ● 12) JSONB
funzioni per esplodere i jsonb ( jsonb_each_text )
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
43. ● 13) Background worker dinamici
Si possono costruire dei worker dinamici e sono registrabili e attivabili
dinamicamente e non più solo al restart
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
44. ● 14) pg_basebackup remapping
Introdotta l’opzione t :
pg_baebackup … -T OLDDIR=NEWDIR
potete quindi fare un backup rimappandola directory della tablespace.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
45. ● 15) GIN Index miglioramenti
*) Riduzione spazio del 40% , sostanzialmente ora vengono salvati i delta [che
sono varbyte e occupano da 1 a 6 byte) e non più tutti gli offset :
overhead = 6 byte
KEY = 7 byte
block_id = 4 byte , offest=2 byte
<9.4 : overhead KEY ( block_id, offset) ( block_id, offset) ( block_id, offset) (
block_id, offset) ( block_id, offset) ( block_id, offset)
>=9.4: overhead KEY ( block_id, offset) Delta1 Delta2 ..
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
46. ● 15) GIN Index miglioramenti
Nel peggiore dei casi occupano la stessa quantità di spazio nel migliore dei casì
però si ottiene così un -40% :
<9.4 6+7+(6*4) = 37 byte
>=9.4 6+7+(6*1)+(3*1) = 22 byte
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
47. ● 15) GIN Index miglioramenti
Altra innovazione sono i posting trees , ovvero quando una pagina dei gin index
non è più sufficiente a contenere una tupla dell’indice allora viene creato un
posting tree compresso .
N.b. se farete upgrade con pg_upgrade, per ottenere i benefici dovrete
reindicizzare!
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
48. ● 16) PG_PREWARM
permette il caricamento in cache db o os di un oggetto, utile dopo un riavvio del
db o per stabilizzare la cache.
create extension pg_prewarm ;
select pg_prewarm(‘nomeoggetto’); -- ritorna il numero di pagine caricate.
m.durighetto@miriade.itwww.itpug.org - www.postgresql.org - www.miriade.it
50. Attribuzione
Non commerciale
Condividi allo stesso modo
4.0 Italia
http://creativecommons.org/licenses/by-nc-sa/3.0/it/
Copyright 2014 Miriade S.p.A. - http://www.miriade.it
Copyright 2012 Miriade S.p.a.
Grazie per l'attenzione
Copyright 2012 Miriade S.p.a. m.durighetto@miriade.it
License
www.itpug.org - www.postgresql.org - www.miriade.it