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.