Oversigt :i denne øvelse vil vi forklare, hvorfor du skal bruge SQLite VACUUM
kommando og vis, hvordan den bruges til at optimere databasefilen.
Hvorfor har du brug for SQLite VACUUM
kommando
For det første, når du slipper databaseobjekter såsom tabeller, visninger, indekser og triggere eller sletter data fra tabeller, forbliver databasefilstørrelsen uændret. Fordi SQLite bare markerer de slettede objekter som gratis og reserverer det til fremtidige brug. Som et resultat vokser størrelsen af databasefilen altid i størrelse.
For det andet, når du indsætter eller sletter data fra tabellerne, bliver indekserne og tabellerne fragmenterede, især for databasen, der har et stort antal indsættelser, opdateringer og sletninger.
For det tredje skaber indsættelses-, opdaterings- og sletningsoperationerne ubrugt datablok på individuelle databasesider. Det reducerer antallet af rækker, der kan gemmes på en enkelt side. Derfor øger det antallet af sider for at holde et bord. På grund af dette øger det lageroverhead for bordet, tager længere tid at læse/skrive og reducerer cache-ydeevnen.
SQLite leverer VACUUM
kommando til at løse alle tre problemer ovenfor.
SQLite kopierer først data i en databasefil til en midlertidig database. Denne operation defragmenterer databaseobjekterne, ignorerer de ledige pladser og ompakker individuelle sider. Derefter kopierer SQLite indholdet af den midlertidige databasefil tilbage til den originale databasefil. Den originale databasefil er overskrevet.
Fordi VACUUM
kommandoen genopbygger databasen, kan du bruge den til at ændre nogle databasespecifikke konfigurationsparametre såsom sidestørrelse, sideformat og standardkodning. For at gøre dette skal du indstille nye værdier ved hjælp af pragma og derefter støvsuge databasen.
SQLite VACUUM
kommando
VACUUM
kommandoen ændrer ikke indholdet af databasen undtagen rowid-værdierne. Hvis du bruger INTEGER PRIMARY KEY
kolonnen, VACUUM
ændrer ikke værdierne for den kolonne. Men hvis du bruger ualiased rowid, er VACUUM
kommandoen nulstiller rowid-værdierne. Udover at ændre rowid-værdierne, er VACUUM
kommandoen bygger også indekset fra bunden.
Det er en god praksis at udføre VACUUM
kommando med jævne mellemrum, især når du sletter store tabeller eller indekser fra en database.
Det er vigtigt at bemærke, at VACCUM
kommandoen kræver lagring for at opbevare den originale fil og også kopien. Også VACUUM
kommandoen kræver eksklusiv adgang til databasefilen. Med andre ord, VACUUM
kommandoen vil ikke køre med succes, hvis databasen har en afventende SQL-sætning eller en åben transaktion.
I øjeblikket, fra og med version 3.9.2, kan du køre VACUUM
kommando på main
database, ikke den vedhæftede databasefil.
Selvom SQLite aktiverer autovakuumtilstanden, der udløser vakuumprocessen automatisk med nogle begrænsninger. Det er en god praksis at køre VACUUM
kommando manuelt.
Sådan kører du SQLite VACUUM
kommando
Det følgende viser, hvordan du kører VACUUM
kommando:
VACUUM;
Code language: SQL (Structured Query Language) (sql)
Sørg for, at der ikke er nogen åben transaktion, mens du kører kommandoen.
Følgende erklæring aktiverer fuld auto-vakuum tilstand:
PRAGMA auto_vacuum = FULL;
Code language: SQL (Structured Query Language) (sql)
For at aktivere inkrementelt vakuum skal du bruge følgende sætning:
PRAGMA auto_vacuum = INCREMENTAL;
Code language: SQL (Structured Query Language) (sql)
Følgende sætning deaktiverer automatisk vakuumtilstand:
PRAGMA auto_vacuum = NONE;
Code language: SQL (Structured Query Language) (sql)
VACUUM
med en INTO
klausul
Her er syntaks for VACUUM
med INTO
klausul:
VACUUM schema-name INTO filename;
Code language: SQL (Structured Query Language) (sql)
VACUUM
sætning med en INTO
klausul beholder den originale databasefil uændret og opretter en ny database med det angivne filnavn. Den nye database vil indeholde det samme logiske indhold som den originale database, men fuldstændig støvsuget.
filename
i INTO
klausul kan være et hvilket som helst SQL-udtryk, der evalueres til en streng. Det skal være en sti til en fil, der ikke findes eller til en tom fil, eller VACUUM INTO
kommando vil resultere i en fejl.
VACUUM
kommandoen er meget nyttig til at generere sikkerhedskopier af en live database. Det er transaktionssikkert, idet den genererede database er et konsistent øjebliksbillede af den originale database. Men hvis en uplanlagt nedlukning eller strømsvigt afbryder kommandoen, kan den genererede database blive beskadiget.
Følgende sætning bruger VACUUM INTO
kommando for at generere en ny database med filnavnet chinook_backup.db
hvis data er kopieret fra main
skema af chinook
database:
VACUUM main INTO 'c:\sqlite\db\chinook_backup.db';
Code language: JavaScript (javascript)
I denne øvelse har du lært, hvorfor du skal bruge SQLite VACUUM
kommando og hvordan den køres for at optimere databasen.