sql >> Database >  >> RDS >> SQLite

SQLite VACUM

Samenvatting :in deze tutorial leggen we uit waarom je de SQLite VACUUM . moet gebruiken commando en laat zien hoe je het kunt gebruiken om het databasebestand te optimaliseren.

Waarom heb je SQLite VACUUM nodig? commando

Ten eerste, wanneer u database-objecten zoals tabellen, views, indexen en triggers verwijdert of gegevens uit tabellen verwijdert, blijft de bestandsgrootte van de database ongewijzigd. Omdat SQLite de verwijderde objecten gewoon als gratis markeert en deze reserveert voor toekomstig gebruik. Als gevolg hiervan wordt de grootte van het databasebestand altijd groter.

Ten tweede, wanneer u gegevens uit de tabellen invoegt of verwijdert, raken de indexen en tabellen gefragmenteerd, vooral voor de database met een groot aantal invoegingen, updates en verwijderingen.

Ten derde creëren de invoeg-, bijwerk- en verwijderbewerkingen een ongebruikt gegevensblok binnen individuele databasepagina's. Het vermindert het aantal rijen dat op één pagina kan worden opgeslagen. Daarom verhoogt het het aantal pagina's dat een tabel kan bevatten. Hierdoor neemt de opslagoverhead voor de tabel toe, duurt het lezen/schrijven langer en nemen de cacheprestaties af.

SQLite biedt de VACUUM commando om alle drie bovenstaande problemen op te lossen.

SQLite kopieert eerst gegevens binnen een databasebestand naar een tijdelijke database. Deze bewerking defragmenteert de database-objecten, negeert de vrije ruimtes en herpakt afzonderlijke pagina's. Vervolgens kopieert SQLite de inhoud van het tijdelijke databasebestand terug naar het oorspronkelijke databasebestand. Het originele databasebestand wordt overschreven.

Omdat de VACUUM opdracht de database opnieuw opbouwt, kunt u deze gebruiken om enkele databasespecifieke configuratieparameters te wijzigen, zoals paginagrootte, pagina-indeling en standaardcodering. Om dit te doen, stelt u nieuwe waarden in met pragma en stofzuigt u vervolgens de database.

De SQLite VACUUM commando

De VACUUM commando verandert de inhoud van de database niet, behalve de rowid-waarden. Als u INTEGER PRIMARY KEY . gebruikt kolom, de VACUUM verandert de waarden van die kolom niet. Als u echter unaliased rowid gebruikt, wordt de VACUUM commando zal de rowid-waarden resetten. Naast het wijzigen van de rowid-waarden, kan de VACUUM commando bouwt ook de index helemaal opnieuw op.

Het is een goede gewoonte om de VACUUM . uit te voeren commando periodiek, vooral wanneer u grote tabellen of indexen uit een database verwijdert.

Het is belangrijk op te merken dat de VACCUM opdracht vereist opslag om het originele bestand en ook de kopie te bewaren. Ook de VACUUM opdracht vereist exclusieve toegang tot het databasebestand. Met andere woorden, de VACUUM commando zal niet succesvol worden uitgevoerd als de database een openstaande SQL-instructie of een openstaande transactie heeft.

Momenteel kunt u vanaf versie 3.9.2 de VACUUM . uitvoeren commando op de main database, niet het bijgevoegde databasebestand.

Hoewel SQLite de auto-vacuümmodus inschakelt die het vacuümproces automatisch activeert met enkele beperkingen. Het is een goede gewoonte om de VACUUM commando handmatig.

Hoe de SQLite VACUUM uit te voeren commando

Hieronder ziet u hoe u de VACUUM . uitvoert commando:

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

Zorg ervoor dat er geen openstaande transactie is terwijl u de opdracht uitvoert.

De volgende verklaring schakelt de volledige auto-vacuümmodus in:

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

Om incrementeel vacuüm in te schakelen, gebruikt u de volgende verklaring:

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

De volgende verklaring schakelt de auto-vacuümmodus uit:

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

VACUUM met een INTO clausule

Hier is de syntaxis van de VACUUM met INTO clausule:

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

De VACUUM statement met een INTO clausule houdt het oorspronkelijke databasebestand ongewijzigd en maakt een nieuwe database met de opgegeven bestandsnaam. De nieuwe database zal dezelfde logische inhoud bevatten als de originele database, maar volledig gestofzuigd.

De filename in de INTO clausule kan elke SQL-expressie zijn die resulteert in een tekenreeks. Het moet een pad zijn naar een bestand dat niet bestaat of naar een leeg bestand, of de VACUUM INTO commando zal resulteren in een fout.

De VACUUM commando is erg handig voor het genereren van back-upkopieën van een live database. Het is transactieveilig, waarbij de gegenereerde database een consistente momentopname is van de originele database. Als een ongeplande uitschakeling of stroomuitval de opdracht echter onderbreekt, is de gegenereerde database mogelijk beschadigd.

De volgende instructie gebruikt de VACUUM INTO commando om een ​​nieuwe database te genereren met de bestandsnaam chinook_backup.db waarvan de gegevens zijn gekopieerd van de main schema van de chinook databank:

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

In deze tutorial heb je geleerd waarom je de SQLite VACUUM . moet gebruiken commando en hoe het uit te voeren om de database te optimaliseren.


  1. ER_NOT_SUPPORTED_AUTH_MODE - MySQL-server

  2. Hoe verbinding maken met MySQL-database?

  3. Hoe de locatie van gegevensbestanden en logbestanden in SQL Server te vinden

  4. MariaDB LENGTHB() uitgelegd