Loading presentation...
Prezi is an interactive zooming presentation

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

HSTORE, JSON e JSONB: dati non strutturati ad alte performance

Nelle ultime release di PostgreSQL è stato fatto un enorme lavoro sui dati non strutturati, culminato con l’aggiunta del tipo JSONB. Insieme a JSON, HSTORE e array fornisce una potenza mai vista per le proprie applicazione web e non solo.
by

Gabriele Bartolini

on 13 March 2015

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of HSTORE, JSON e JSONB: dati non strutturati ad alte performance

CREATE TABLE reviews(review json);

COPY reviews FROM 'customer_reviews_nested_1998.json';
COPY 589859
Time: 20883,784 ms


CREATE INDEX ON reviews USING gin(review);
CREATE INDEX
Time: 263099,010 ms

SELECT round(avg((review->'review_rating')::numeric), 2)
FROM reviews
WHERE review @> 'product_category => "Home & Garden"';
round
-------
4.59
(1 row)

Time: 11,800 ms
HSTORE, JSON e JSONB
Marco Nenciarini
PostgreSQL consultant
2ndQuadrant Italia

Dati non strutturati ad alte performance
Contatti
@mnencia
marco.nenciarini@2ndquadrant.it
Azienda fondata in UK da Simon Riggs (code committer)
Uffici in Europa, America, Oceania, Asia
Sponsor di platino di PostgreSQL
Modello di business open source
Leader HA, Disaster Recovery, Scalabilità e Performance su PostgreSQL
Supporto 24/7 ("follow the sun")
JSON
Introdotto in PostgreSQL 9.2
Memorizzazione come testo
Validazione
PostgreSQL 9.3
Operatori e funzioni
Integrazione con hstore
Postgresql 9.4
Funzioni di generazione
No indici GIN e GiST
PgDay 2014
Prato, 7 novembre 2014

Prestazioni vs
Durabilità
Flessibilità vs
Rigidità
NOSQL vs
SQL?
Not Only SQL
Sommario
Tipo di dato XML
Tipo di dato hstore
Tipo di dato JSON
Prestazioni
www.2ndQuadrant.it
Estensibilità

Capacità di rinnovarsi, sempre
Postgres
CTO di 2ndQuadrant Italia
PostgreSQL database design and administration
Co-fondatore Italian PostgreSQL Users Group (www.itpug.org)
mnencia
PostgreSQL 8.2 (2006)
Tipo di dato
Validazione
Testo
SQL:2003
XML
select
xmlelement
(name PgDay,

xmlattributes
(
'Prato' as location,
'7 Nov 2014' as date
),
'Interesting people');
xmlelement
---------------------------------------------------------------------------
<pgday location="Prato" date="7 Nov 2014">
Interesting people
</pgday>
Funzioni di generazione
SELECT
query_to_xml
($$SELECT id, name FROM sketches$$,
true, false, '');
query_to_xml
---------------------------------------------------------------
<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<id>1</id>
<name>Dead Parrot</name>
</row>
<row>
<id>2</id>
<name>Spam</name>
</row>
</table>
Funzioni di output
SELECT
xpath
('/table/row[id/text()=1]/name/text()', $$
<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<id>1</id>
<name>Dead Parrot</name>
</row>
<row>
<id>2</id>
<name>Spam</name>
</row>
</table>
$$);
xpath
-----------------
{"Dead Parrot"}
XPath support
No indici GIN e GiST
hstore
PostgreSQL 8.2 (2006)
Memorizzazione binaria
Memorizzazione chiave/valore
Un solo livello
Stringhe come chiavi e valori
Supporta indici GIN e GiST
CREATE EXTENSION
hstore
;

SELECT 'a=>1,a=>2'::hstore;
hstore
----------
"a"=>"1"
(1 row)

SELECT 'author => "Monty Python", sketch => Spam'::hstore -> 'author' AS author;
author
--------------
Monty Python
(1 row)
Prestazioni?
Recensioni su Amazon nel 1998
589859 record
209MB su disco
convertiti da JSON nidificato a hstore
245MB su disco

Dati di test
http://examples.citusdata.com/customer_reviews_nested_1998.json.gz
CREATE TABLE reviews (review hstore);

COPY reviews FROM 'customer_reviews_1998.hstore';
COPY 589859
Time: 26230,584 ms


SELECT round(avg((review->'review_rating')::numeric), 2)
FROM reviews WHERE review -> 'product_category' = 'Home & Garden';
round
-------
4.59
(1 row)

Time: 291,294 ms
senza indici
Generazione di valori JSON
converte un valore in JSON, utilizzando, sulla base del tipo:
casting
rappresentazione testuale
to_json(anyelement)
aggrega un set di record come un array di oggetti JSON
json_agg(record)
Altre funzioni interessanti
json_each(json)
json_each_text(json)
json_object_keys(json)
json_array_length(json)
json_array_elements(json)
json_array_elements_text(json)
Dettaglio: http://www.postgresql.org/docs/9.4/static/functions-json.html
Alcuni operatori
JSON -> int
Accede a un elemento interno dell'array
JSON -> text
Accede a un campo interno
'[1,2,3]'::json->2
'{"a":1,"b":2}'::json->'b'
Variante #>>
Restituisce testo
Con due '>'
Dettaglio: http://www.postgresql.org/docs/9.4/static/functions-json.html
JSON #> text[]
Accede a un percorso
'{"a": {"b":2}}'::json->'{a,b}'
Indici funzionali!
Dettaglio: http://www.postgresql.org/docs/9.4/static/hstore.html
Alcuni operatori
hstore -> text
Accede al valore di una chiave
hstore ? text
Controlla 'esistenza di una chiave
'a=>1,b=>2'::hstore -> 'a'
'a=>1,b=>2'::hstore ? 'b'
Dettaglio: http://www.postgresql.org/docs/9.4/static/hstore.html
hstore @> hstore
È contenuto in
'a=>1,b=>2'::hstore @> 'a=>1'
Dettagli: http://www.postgresql.org/docs/9.4/static/functions-xml.html
JSONB
Introdotto in PostgreSQL 9.4
Stessi punti di forza di JSON
Formato binario specializzato
Non preserva
Chiavi duplicate
Ordine delle chiavi
Indici GIN e GiST
Stesse funzioni di JSON
Prefisso jsonb

Prestazioni hstore
CREATE INDEX on reviews ((review#>>'{product,category}'));
CREATE INDEX
Time: 17191,415 ms

SELECT round(avg((review#>>'{review,rating}')::numeric), 2) FROM reviews WHERE review#>>'{product,category}' = 'Home & Garden';
round
-------
4.59
(1 row)

Time: 22,860 ms
SELECT round(avg((review#>>'{review,rating}')::numeric), 2) FROM reviews WHERE review#>>'{product,category}' = 'Home & Garden';
round
-------
4.59
(1 row)

Time: 2519,616 ms
senza indici, parsing dei dati, lentissimo
Prestazioni JSON
20% più veloce di hstore
CREATE INDEX on reviews USING gin(review);
CREATE INDEX
Time: 29443,684 ms

SELECT round(avg((review#>>'{review,rating}')::numeric), 2) FROM reviews WHERE review@>'{"product": {"category": "Home & Garden"}}';
round
-------
4.59
(1 row)

Time: 18,395 ms
CREATE TABLE reviews(review jsonb);

COPY reviews FROM customer_reviews_nested_1998.json';
COPY 589859
Time: 15975,184 ms
SELECT round(avg((review#>>'{review,rating}')::numeric), 2) FROM reviews WHERE review#>>'{product,category}' = 'Home & Garden';
round
-------
4.59
(1 row)

Time: 378,128 ms
senza indici, leggermente più lento di hstore
Prestazioni JSONB
simile a hstore
4.5 minuti
, indice generico
veloce!
indice funzionale, non generico
veloce, solo per ricerche per categoria di prodotto
10 volte più veloce di hstore, indice generico
veloce, per qualsiasi ricerca!
JSONB: operatori aggiuntivi
jsonb ? text
Controlla l'esistenza di una chiave
'{"a":1,"b":2}'::jsonb ? 'a'
Dettaglio: http://www.postgresql.org/docs/9.4/static/function-json.html
jsonb @> hstore
È contenuto in
'{"a":1,"b":2}'::jsonb @> '{"a":1}'
jsonb = jsonb
Uguaglianza
'{"a":1,"b":2}'::jsonb = '{"b":2,"a":1}'
Scegliere il tipo giusto
XML
Dati preesistenti
Compatibilità con applicazioni
hstore
Struttura semplice, limitato
Operazioni veloci
JSON
Ordine delle chiavi importante
Duplicati importanti
E per il resto?
Full transcript