sql >> Databáze >  >> RDS >> SQLite

SQLite VACUUM

Shrnutí :v tomto tutoriálu vysvětlíme, proč potřebujete používat SQLite VACUUM a ukázat, jak jej použít k optimalizaci databázového souboru.

Proč potřebujete SQLite VACUUM příkaz

Za prvé, když zrušíte databázové objekty, jako jsou tabulky, pohledy, indexy a spouštěče, nebo odstraníte data z tabulek, velikost databázového souboru zůstane nezměněna. Protože SQLite pouze označí smazané objekty jako volné a rezervuje je pro budoucí použití. Výsledkem je, že velikost databázového souboru vždy roste.

Zadruhé, když vložíte nebo odstraníte data z tabulek, indexy a tabulky se fragmentují, zejména u databáze, která má vysoký počet vložení, aktualizací a odstranění.

Za třetí, operace vkládání, aktualizace a mazání vytvářejí nepoužitý datový blok v rámci jednotlivých databázových stránek. Snižuje počet řádků, které lze uložit na jednu stránku. Proto zvyšuje počet stránek pro umístění tabulky. Z tohoto důvodu zvyšuje režii úložiště pro tabulku, trvá déle čtení/zápis a snižuje výkon mezipaměti.

SQLite poskytuje VACUUM příkaz k vyřešení všech tří výše uvedených problémů.

SQLite nejprve zkopíruje data v databázovém souboru do dočasné databáze. Tato operace defragmentuje databázové objekty, ignoruje volná místa a znovu zabalí jednotlivé stránky. Poté SQLite zkopíruje obsah dočasného databázového souboru zpět do původního databázového souboru. Původní soubor databáze je přepsán.

Protože VACUUM příkaz znovu sestaví databázi, můžete jej použít ke změně některých konfiguračních parametrů specifických pro databázi, jako je velikost stránky, formát stránky a výchozí kódování. Chcete-li to provést, nastavte nové hodnoty pomocí pragma a poté databázi vysajte.

SQLite VACUUM příkaz

VACUUM příkaz nemění obsah databáze kromě hodnot rowid. Pokud používáte INTEGER PRIMARY KEY sloupec VACUUM nezmění hodnoty tohoto sloupce. Pokud však použijete nepřiřazený rowid, VACUUM příkaz resetuje hodnoty rowid. Kromě změny hodnot rowid, VACUUM příkaz také vytvoří index od začátku.

Je dobrým zvykem provádět VACUUM příkaz pravidelně, zvláště když odstraňujete velké tabulky nebo indexy z databáze.

Je důležité poznamenat, že VACCUM příkaz vyžaduje úložiště pro uložení původního souboru a také kopie. Také VACUUM příkaz vyžaduje výhradní přístup k souboru databáze. Jinými slovy, VACUUM příkaz se nespustí úspěšně, pokud má databáze čekající příkaz SQL nebo otevřenou transakci.

Aktuálně, od verze 3.9.2, můžete spustit VACUUM příkaz na main databázi, nikoli připojený databázový soubor.

Přestože SQLite umožňuje režim auto-vakuování, který spouští proces vakuování automaticky s určitými omezeními. Je dobrým zvykem spustit VACUUM příkaz ručně.

Jak spustit SQLite VACUUM příkaz

Následující text ukazuje, jak spustit VACUUM příkaz:

VACUUM;Code language: SQL (Structured Query Language) (sql)

Ujistěte se, že během spouštění příkazu není žádná otevřená transakce.

Následující příkaz umožňuje režim plného automatického vakua:

PRAGMA auto_vacuum = FULL;Code language: SQL (Structured Query Language) (sql)

Chcete-li povolit přírůstkové vakuum, použijte následující příkaz:

PRAGMA auto_vacuum = INCREMENTAL;Code language: SQL (Structured Query Language) (sql)

Následující příkaz deaktivuje režim automatického vakuování:

PRAGMA auto_vacuum = NONE;Code language: SQL (Structured Query Language) (sql)

VACUUM s INTO klauzule

Zde je syntaxe VACUUM pomocí INTO klauzule:

VACUUM schema-name INTO filename;Code language: SQL (Structured Query Language) (sql)

VACUUM příkaz s INTO klauzule zachová původní databázový soubor beze změny a vytvoří novou databázi se zadaným názvem souboru. Nová databáze bude obsahovat stejný logický obsah jako původní databáze, ale plně vakuovaná.

filename v INTO klauzule může být jakýkoli výraz SQL, který se vyhodnotí jako řetězec. Musí to být cesta k souboru, který neexistuje, nebo k prázdnému souboru, nebo VACUUM INTO příkaz způsobí chybu.

VACUUM je velmi užitečný pro generování záložních kopií živé databáze. Je to transakční bezpečné, přičemž vygenerovaná databáze je konzistentním snímkem původní databáze. Pokud však neplánované vypnutí nebo výpadek napájení přeruší příkaz, vygenerovaná databáze může být poškozena.

Následující příkaz používá VACUUM INTO příkaz pro vygenerování nové databáze s názvem souboru chinook_backup.db jehož data jsou zkopírována z main schéma chinook databáze:

VACUUM main INTO 'c:\sqlite\db\chinook_backup.db';Code language: JavaScript (javascript)

V tomto tutoriálu jste se naučili, proč potřebujete používat SQLite VACUUM a jak jej spustit pro optimalizaci databáze.


  1. Výkonnostní překvapení a předpoklady:DATEDIFF

  2. SQL Server 2016:sys.dm_exec_function_stats

  3. Snímky databáze SQL Server -3

  4. Vysoká dostupnost databáze pro Camunda BPM pomocí MySQL nebo MariaDB Galera Cluster