sql >> Databasteknik >  >> RDS >> SQLite

SQLite VAKUUM

Sammanfattning :i denna handledning kommer vi att förklara varför du behöver använda SQLite VACUUM kommandot och visa hur du använder det för att optimera databasfilen.

Varför behöver du SQLite VACUUM kommando

För det första, när du släpper databasobjekt som tabeller, vyer, index och utlösare eller tar bort data från tabeller, förblir databasfilstorleken oförändrad. Eftersom SQLite bara markerar de borttagna objekten som gratis och reserverar det för framtida användningar. Som ett resultat växer storleken på databasfilen alltid i storlek.

För det andra, när du infogar eller tar bort data från tabellerna, blir indexen och tabellerna fragmenterade, särskilt för databasen som har ett stort antal infogningar, uppdateringar och borttagningar.

För det tredje skapar operationerna infoga, uppdatering och radering oanvända datablock inom individuella databassidor. Det minskar antalet rader som kan lagras på en enda sida. Därför ökar det antalet sidor för att hålla ett bord. På grund av detta ökar det lagringskostnader för bordet, tar mer tid att läsa/skriva och minskar cacheprestanda.

SQLite tillhandahåller VACUUM kommando för att lösa alla tre frågorna ovan.

SQLite kopierar först data i en databasfil till en temporär databas. Denna operation defragmenterar databasobjekten, ignorerar de lediga utrymmena och packar om enskilda sidor. Sedan kopierar SQLite innehållet i den temporära databasfilen tillbaka till den ursprungliga databasfilen. Den ursprungliga databasfilen skrivs över.

Eftersom VACUUM kommandot bygger om databasen kan du använda det för att ändra vissa databasspecifika konfigurationsparametrar som sidstorlek, sidformat och standardkodning. För att göra detta ställer du in nya värden med hjälp av pragma och dammsuger sedan databasen.

SQLites VACUUM kommando

VACUUM kommandot ändrar inte innehållet i databasen förutom rowid-värdena. Om du använder INTEGER PRIMARY KEY kolumnen, VACUUM ändrar inte värdena för den kolumnen. Men om du använder oaliaserad rowid, visas VACUUM kommandot återställer rowid-värdena. Förutom att ändra rowid-värdena, är VACUUM kommandot bygger också indexet från början.

Det är en god praxis att utföra VACUUM kommandot regelbundet, speciellt när du tar bort stora tabeller eller index från en databas.

Det är viktigt att notera att VACCUM kommandot kräver lagring för att lagra originalfilen och även kopian. Även VACUUM kommandot kräver exklusiv åtkomst till databasfilen. Med andra ord, VACUUM kommandot kommer inte att köras framgångsrikt om databasen har en väntande SQL-sats eller en öppen transaktion.

För närvarande, från och med version 3.9.2, kan du köra VACUUM kommandot på main databas, inte den bifogade databasfilen.

Även om SQLite aktiverar autovakuumläget som utlöser vakuumprocessen automatiskt med vissa begränsningar. Det är en god praxis att köra VACUUM kommandot manuellt.

Hur man kör SQLite VACUUM kommando

Följande visar hur du kör VACUUM kommando:

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

Se till att det inte finns någon öppen transaktion medan du kör kommandot.

Följande uttalande aktiverar fullt autovakuumläge:

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

För att aktivera inkrementellt vakuum använder du följande sats:

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

Följande påstående inaktiverar automatiskt vakuumläge:

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

VACUUM med en INTO klausul

Här är syntaxen för VACUUM med INTO klausul:

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

VACUUM uttalande med en INTO klausulen behåller den ursprungliga databasfilen oförändrad och skapar en ny databas med det angivna filnamnet. Den nya databasen kommer att innehålla samma logiska innehåll som den ursprungliga databasen, men helt dammsugad.

filename i INTO sats kan vara vilket SQL-uttryck som helst som utvärderas till en sträng. Det måste vara en sökväg till en fil som inte finns eller till en tom fil, eller VACUUM INTO kommandot kommer att resultera i ett fel.

VACUUM kommandot är mycket användbart för att skapa säkerhetskopior av en livedatabas. Det är transaktionssäkert, vilket den genererade databasen är en konsekvent ögonblicksbild av den ursprungliga databasen. Men om en oplanerad avstängning eller strömavbrott avbryter kommandot, kan den genererade databasen vara skadad.

Följande sats använder VACUUM INTO kommando för att generera en ny databas med filnamnet chinook_backup.db vars data kopieras från main schema för chinook databas:

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

I den här handledningen har du lärt dig varför du behöver använda SQLite VACUUM kommandot och hur man kör det för att optimera databasen.


  1. Jämförelse av datatyperna för datum och tid i SQL Server

  2. Hur man skapar ett formulär med formulärguiden

  3. Maximal storlek för en SQL Server-fråga? IN-klausul? Finns det ett bättre tillvägagångssätt

  4. Begränsa en länkad server till en enda lokal inloggning (T-SQL-exempel)