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.