sql >> Databáze >  >> RDS >> MariaDB

Co jsou dočasné tabulky MariaDB?

Od 10.3.4 přichází MariaDB s dočasnými tabulkami. Je to stále poměrně neobvyklá funkce a rádi bychom trochu probrali, co tyto tabulky jsou a k čemu mohou být užitečné.

Za prvé, v případě, že si někdo špatně přečetl název tohoto blogu, mluvíme zde o dočasných tabulkách, nikoli o dočasných tabulkách, které také existují v MariaDB. Mají však něco společného. Čas. Dočasné tabulky jsou krátkodobé, na druhé straně dočasné tabulky jsou navrženy tak, aby umožňovaly přístup k datům v průběhu času. Stručně řečeno, dočasné tabulky můžete vidět jako tabulku s verzemi, kterou lze použít k přístupu a úpravě minulých dat, zjištění, jaké změny byly provedeny a kdy. Lze jej také použít k vrácení dat do určitého bodu v čase.

Jak používat dočasné tabulky v MariaDB

Chceme-li vytvořit dočasnou tabulku, musíme k příkazu CREATE TABLE přidat pouze „WITH SYSTEM VERSIONING“. Pokud chcete převést běžnou tabulku na dočasnou, můžete spustit:

ALTER TABLE mytable ADD SYSTEM VERSIONING;

To je v podstatě vše. Vytvoří se dočasná tabulka a můžete začít dotazovat se na její data. Existuje několik způsobů, jak to udělat.

Nejprve můžeme použít SELECT k dotazování na data k určitému času:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TIMESTAMP ‘2020-06-26 10:00:00’;

Můžete také zadat dotaz na rozsah:

SELECT * FROM mytable FOR SYSTEM_TIME FROM ‘2020-06-26 08:00:00’ TO ‘2020-06-26 10:00:00’;

Je také možné zobrazit všechna data:

SELECT * FROM mytable FOR SYSTEM_TIME ALL;

V případě potřeby můžete vytvořit pohledy z časových tabulek podle stejného vzoru, jaký jsme ukázali výše.

Vzhledem k tomu, že stejné řádky nemusí být aktualizovány na všech uzlech současně (například zpoždění způsobená replikací), chcete-li vidět přesně stejný stav dat napříč více otroků, můžete definovat časový okamžik pomocí id transakce InnoDB:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;

Ve výchozím nastavení jsou všechna data uložena ve stejné tabulce, aktuální i stará verze řádků. To může přidat určitou režii při dotazu pouze na poslední data. Je možné použít oddíly ke snížení této režie vytvořením jednoho nebo více oddílů pro ukládání historických dat a jednoho pro ukládání posledních verzí řádků. Poté bude MariaDB pomocí prořezávání oddílů schopna snížit množství dat, která musí dotazovat, aby přišla s výsledkem pro dotaz:

CREATE TABLE mytable (a INT) WITH SYSTEM VERSIONING

  PARTITION BY SYSTEM_TIME INTERVAL 1 WEEK (

    PARTITION p0 HISTORY,

    PARTITION p1 HISTORY,

    PARTITION p2 HISTORY,

    PARTITION pcur CURRENT

  );

Můžete také použít jiné způsoby rozdělení, jako je například definování počtu řádků k uložení na oddíl.

Při používání dělení můžeme nyní použít běžné osvědčené postupy dělení, jako je rotace dat odstraněním starých oddílů. Pokud jste nevytvořili oddíly, stále to můžete provést pomocí příkazů jako:

DELETE HISTORY FROM mytable;

DELETE HISTORY FROM mytable BEFORE SYSTEM_TIME '2020-06-01 00:00:00';

V případě potřeby můžete některé sloupce z verzování vyloučit:

CREATE TABLE mytable (

   a INT,

   b INT WITHOUT SYSTEM VERSIONING

) WITH SYSTEM VERSIONING;

V MariaDB 10.4 byla přidána nová možnost, aplikační období. V zásadě to znamená, že namísto systémového času je možné vytvořit verzování na základě dvou sloupců (na základě času) v tabulce:

CREATE TABLE mytable (

   a INT, 

   date1 DATE,

   date2 DATE,

   PERIOD FOR date_period(date1, date2));

Je také možné aktualizovat nebo mazat řádky podle času (UPDATE FOR PORTION a DELETE FOR PORTION). V jedné tabulce je také možné kombinovat verzování v čase aplikace a v čase systému.

Příklady časových tabulek v MariaDB

Dobře, probrali jsme možnosti, pojďme se podívat na některé věci, které můžeme dělat s dočasnými tabulkami.

Nejprve vytvořte tabulku a naplňte ji daty:

MariaDB [(none)]> CREATE DATABASE versioned;

Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> use versioned

Database changed

MariaDB [versioned]> CREATE TABLE mytable (a INT, b INT) WITH SYSTEM VERSIONING;

Query OK, 0 rows affected (0.005 sec)



MariaDB [versioned]> INSERT INTO mytable VALUES (1,1);

Query OK, 1 row affected (0.001 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (2,1);

Query OK, 1 row affected (0.001 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (3,1);

Query OK, 1 row affected (0.000 sec)

Nyní aktualizujme několik řádků:

MariaDB [versioned]> UPDATE mytable SET b = 2 WHERE a < 3;

Query OK, 2 rows affected (0.001 sec)

Rows matched: 2  Changed: 2  Inserted: 2  Warnings: 0

Nyní se podívejme na všechny řádky, které jsou v tabulce uloženy:

MariaDB [versioned]> SELECT * FROM mytable FOR SYSTEM_TIME ALL ;

+------+------+

| a    | b    |

+------+------+

|    1 |    2 |

|    2 |    2 |

|    3 |    1 |

|    1 |    1 |

|    2 |    1 |

+------+------+

5 rows in set (0.000 sec)

Jak vidíte, tabulka obsahuje nejen aktuální verze řádků, ale také původní hodnoty z doby, než jsme je aktualizovali.

Nyní se podívejme, kolik je hodin, a poté přidejte další řádky. Uvidíme, jestli uvidíme aktuální a minulou verzi.

MariaDB [versioned]> SELECT NOW();

+---------------------+

| NOW()               |

+---------------------+

| 2020-06-26 11:24:55 |

+---------------------+

1 row in set (0.000 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (4,1);

Query OK, 1 row affected (0.001 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (5,1);

Query OK, 1 row affected (0.000 sec)

MariaDB [versioned]> UPDATE mytable SET b = 3 WHERE a < 2;

Query OK, 1 row affected (0.001 sec)

Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0;

Nyní se podíváme na obsah tabulky. Pouze aktuální verze řádků:

MariaDB [versioned]> SELECT * FROM mytable;

+------+------+

| a    | b    |

+------+------+

|    1 |    3 |

|    2 |    2 |

|    3 |    1 |

|    4 |    1 |

|    5 |    1 |

+------+------+

5 rows in set (0.000 sec)

Potom se podívejme na stav tabulky, než jsme provedli vložení a aktualizace:

MariaDB [versioned]> SELECT * FROM mytable FOR SYSTEM_TIME AS OF TIMESTAMP '2020-06-26 11:24:55';

+------+------+

| a    | b    |

+------+------+

|    2 |    2 |

|    3 |    1 |

|    1 |    2 |

+------+------+

3 rows in set (0.000 sec)

Funguje podle očekávání, v tabulce vidíme pouze tři řádky.

Tento krátký příklad není v žádném případě obsáhlý. Chtěli jsme vám poskytnout určitou představu, jak můžete ovládat časové tabulky. Aplikace tohoto jsou četné. Lepší sledování stavu objednávky v e-commerce, verzování obsahu (konfigurační soubory, dokumenty), náhled do minulých dat pro analytické účely.

Aby bylo jasno, tuto funkci lze implementovat pomocí „tradičních“ tabulek, pokud budete řádky vkládat, nikoli je aktualizovat, ale správa je mnohem jednodušší, když používáte dočasné tabulky.


  1. 3 způsoby, jak převést celé číslo na desítkové v SQL Server

  2. Jak vybrat pouze 1 řádek z Oracle SQL?

  3. Jedinečné omezení ORA-00001 porušeno

  4. Přehled různých uzlů pomocného plánu v PostgreSQL