ClickHouse
e' un Columnar Database SQL, distribuito e con ottime prestazioni
sulle attivita' OLAP (On-Line Analytical Processing).
In questa paginetta vediamo una sua particolare funzionalita':
le materialized views.
ClickHouse e' di semplice installazione, gestione ed utilizzo (mediante il linguaggio SQL).
Non da ultimo... ClickHouse e' completamente Open Source con una licenza molto aperta (Apache 2.0).
ClickHouse e' un database colonnare che utilizza un dialetto SQL simile a quello MySQL e che e' molto completo. Gli statement di DELETE ed UPDATE in CH sono differenti dallo standard SQL e le insert vengono effettuate in batch, ma le altre sintassi sono praticamente le stesse.
In particolare ClickHouse fornisce il supporto completo per le viste:
Una vista non e' altro che una SELECT salvata e richiamabile successivamente...
Dal punto di vista elaborativo viene eseguita ogni volta la query originale.
Per cancellare una vista? DROP TABLE!
Una funzionalita' molto utile e specifica di ClickHouse sono le Materialized Views.
Le materilized view utilizzano lo storage per mantenere i dati gia' calcolati,
come avviene sul altri database relazionali,
pero' in ClickHouse la differenza sostanziale e'
la modalita' di popolamento delle viste.
Dal punto di vista sintattico si definiscono come normali viste aggiungendo la keyword MATERIALIZED. Ma dal punto di vista elaborativo cambiano rispetto alle normali viste. Infatti il risultato della query viene salvato come su una normale tabella e quindi va specificato il relativo Engine in fase di creazione. Sulla vista materializzata le query possono risultare notevolmente piu' veloci perche' contengono gia' i dati di interesse:
Per i curiosi, o quelli come me che vogliono sempre provare i comandi, riportiamo anche una possibile definizione della tabella su cui si basa la vista:
CREATE TABLE enterprise_log ( timestamp DateTime, server String, level String, message String ) ENGINE=MergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY (timestamp, server); insert into enterprise_log values(now(), 'server1', 'ERROR', 'Wrong password');
Quando vengono inseriti nuovi dati la query della vista viene applicata
alle nuove Part ed i dati vengono inseriti anche nella vista materializzata.
Quando la MV viene creata risulta vuota e solo i nuovi dati verranno inseriti
[NdA a meno di non utilizzare la clasuola POPULATE che pero' e' sconsigliata].
Tutte le clausole della SELECT della vista vengono applicate ai dati
inseriti nella Part e non nel loro insieme.
Questo rende l'aggiornamento delle materialized view
molto efficiente.
Quindi per fare in modo che un GROUP BY venga applicato sull'intero insieme di dati
va utilizzato un Engine adatto.
Poiche' l'Engine effettua i raggruppamenti in fase di merge,
e questi non sono immediati, e' necessario utilizzare il raggruppamento anche
nelle SELECT:
Per nascondere la difficolta' delle funzioni di gruppo -Merge e' ovviamente possibile utilizzare una normale vista... ma questo e' banale!
Questa sintassi e' piu' flessibile perche' consente di modificare la
struttura dati senza ricreare la vista ovvero ricreare la MV senza perdere i dati.
L'altro vantaggio e' nell'evoluzione del database:
l'aggiunta di colonne o la loro variazione diventa cosi' possibile nel tempo.
E' stata utilizzata una MV raggruppando per un campo chiave. E' importante notare l'Engine utilizzato (AggregatingMergeTree) e la clausola di ORDER BY.
Altro esempio classico e' quello di aggregare i dati per intervallo di tempo:
Alle MV possono essere assegnate retention differenti dalle tabelle da cui hanno origine, ma questo lo vediamo in un altro articolo!
Il documento Introduzione a ClickHouse contiene una presentazione sulle funzioni di base, DBA scripts contiene alcuni dei comandi piu' utili per il DBA ed il documento Architettura di ClickHouse descrive gli aspetti piu' tecnici.
Le materialized view sono disponibili nei principali database relazionali
ma presentano differenze rispetto all'implementazione di ClickHouse.
Infatti su altri Database relazionali (eg. Oracle, PostgreSQL)
le Materialized View sono tipicamente mantenute ad intervalli
di tempo regolari rieseguendo ogni volta la query.
Un comportamento simile a quello di ClickHouse con un database relazionale
si puo' ottenere utilizzando i trigger...
che pero' operano record per record e non per Part come in ClickHouse.
Passando ai Times-Series DB
anche le Continuous Queries (CQ) di InfluxQL vengono eseguite a tempo
mentre TimescaleDB ha di recente introdotto le viste
continuous-aggregates
che sono molto simili a quelle di ClickHouse.
Titolo: ClickHouse Materialized Views
Livello: Medio
Data:
1 Aprile 2019 🐟
Versione: 1.0.0 - 1 Aprile 2019
©
Autore: mail [AT] meo.bogliolo.name