2010-01-27 9 views
41

Ich arbeite mit SQLite3-Datei.sqlite Dateigröße ändern nach "DELETE FROM Tabelle"

Zuerst habe ich relativ große Datenbank eingegeben, Dateigröße war etwa 100 MB.

als ich

gemacht
$db->exec("DELETE FROM table"); 

und trat nur einen kleinen Teil dieser Datenbank. Aber die Dateigröße blieb 100 mb.

Was sollten Sie tun, um die sqlite-Dateigröße beim Löschen des Inhalts zu ändern?

Antwort

71

Der Befehl, den Sie suchen, ist vacuum. Es gibt auch eine pragma um Auto-Staubsaugen einzuschalten.

Aus der Dokumentation:

Wenn ein Objekt (Tabelle, Index, Trigger, oder Ansicht) aus der Datenbank gelöscht wird, es hinter leeren Raum verläßt. Dieser leere Speicherplatz wird wiederverwendet, der nächste Zeit neue Informationen hinzugefügt werden, um die Datenbank. Aber in der Zwischenzeit könnte die Datenbankdatei größer als unbedingt erforderlich sein. Auch häufigen Einfügungen, Updates und Löschungen können bewirken, dass die Informationen in der Datenbank fragmentiert werden - über die gesamte Datenbank-Datei eher als an einer Stelle zusammen gruppiert.

Der VACUUM Befehl reinigt die Haupt Datenbank durch seinen Inhalt auf eine temporäre Datenbank-Datei zu kopieren und die ursprüngliche Datenbankdatei aus der Kopie neu zu laden. Dadurch werden freie Seiten eliminiert, gleicht Tabellendaten aneinander an, und ansonsten wird die Dateistruktur der Datenbank aufgeräumt.

+0

Gibt es eine Möglichkeit, die noch nicht überschriebenen gelöschten Tabellenzeilen wiederherzustellen? – Blauhirn

-2

Reinigungsdatenbanken SQLite hat zwei Befehle, die für die Reinigung - Reindex und Vakuum - ausgelegt sind. Reindex wird verwendet, um Indizes neu zu erstellen. Es hat zwei Formen: reindex collation_name; Reindex Tabellenname | Indexname;

12

können Sie dies

$db->exec("DELETE FROM table"); 
$db->exec("vacuum"); 

und die Dateigröße geändert werden.

Verwandte Themen