Sloupcová databáze
Vertica má zajímavou vlastnost, která umožňuje dělat
dotazy i na již neexistující data (smazaná nebo změněná).
Syntaxe vypadá tak, že se před běžný dotaz SELECT předřadí čas, ve kterém nás zajímá stav dat:
at time '2014-08-13 00:30:00' select * from moje;
Celé to funguje tak, že Vertica po operaci DELETE nemaže smazané řádky přímo, ale jenom je jako smazané označí. Operaci UPDATE Vertica implementuje jako smazání řádku a vložení nového (DELETE+INSERT).
Metadatům o smazaných řádcích Vertica říká
delete vektory a jejich stav můžeme zjistit ze systémové tabulky
delete_vectors:
select projection_name,sum(deleted_row_count) as deleted_row_count,floor(sum(used_bytes)/1024) as used_kb from delete_vectors group by projection_name order by projection_name;
projection_name | deleted_row_count | used_kb
-----------------+-------------------+---------
moje_super | 5 | 16
To, jak daleko do historie Vertica "vidí", se
konfiguruje pomocí parametrů HistoryRetentionTime (počet sekund) nebo
HistoryRetentionEpochs (počet zpětně uchovávaných
epoch). Pokud oba parametry nastavíme na -1, Vertica si bude smazaná data pamatovat navždy.
Seznam aktuálních epoch můžeme zjistit ze systémové tabulky
epochs:
select * from epochs;
epoch_close_time | epoch_number
-------------------------------+--------------
2014-08-13 12:05:52.71345+02 | 16259
2014-08-13 14:49:47.034859+02 | 16260
2014-08-13 14:49:47.04223+02 | 16261
Pro zjištění údajů o aktuální epoše můžeme využít
funkce:
select GET_AHM_TIME() as time, GET_AHM_EPOCH() as epoch;
time | epoch
------------------------------------------------+-------
Current AHM Time: 2014-08-13 14:49:47.04223+02 | 16261
AHM znamená
Ancient History Mark a je to značka, označující nejstarší uchovávanou epochu -- starší epochy je možné smazat.
AHM je možné nastavit i ručně, funkcemi
SET_AHM_TIME (nastaví AHM na daný čas),
SET_AHM_EPOCH (nastaví AHM na danou epochu),
MAKE_AHM_NOW (nastaví AHM na aktuální čas).
Skutečné mazání dat (PURGE) z epoch starších než AHM řídí Vertica
automaticky nebo je můžeme vyvolat
ručně.
O automatiku se stará komponenta
Tuple mover při provádění operace
mergeout -- neplést s operací
moveout, která přesouvá data z
Write Optimized Storage (WOS) do
Read Optimized Storage (ROS).
Ruční purge můžeme provést
funkcemi PURGE_TABLE (provede purge dat v dané tabulce a všech jejích projekcích),
PURGE_PROJECTION (provede purge dat v dané projekci) a
PURGE (provede purge v celém databázovém schématu).