- ベストアンサー
【sqlite3】deleteしても.dbファイルのサイズは減らない?
- SQLite3を使用している場合、insertしたレコードをdeleteしてもDBファイルのサイズは小さくなりません。そこで、フラグの立っているレコードを一つselectして該当レコードをupdateする方法を知りたいです。また、複数レコードが選択された場合やレコードが一つも選択されなかった場合の条件判定についても教えてください。
- SQLite3を使用している場合、insertしたレコードをdeleteしてもDBファイルのサイズが変わらないことがわかりました。そこで、フラグの立っているレコードを一つselectして該当レコードをupdateする方法を教えてください。また、複数レコードが選択された場合やレコードが一つも選択されなかった場合の条件判定についても教えてください。
- SQLite3の使用中にinsertしたレコードをdeleteしてもDBファイルのサイズは変わりません。そこで、フラグの立っているレコードを一つselectして該当レコードをupdateする方法について教えてください。また、複数レコードが選択された場合やレコードが一つも選択されなかった場合の条件判定についても教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
素直にvacuum
その他の回答 (1)
- copymaster
- ベストアンサー率81% (83/102)
mattalixさんが回答されているとおりですが、 SQLite、PostgreSQLなどの追記型のデータベースは、deleteで論理削除し、vacuumで物理削除するしくみです。 (ちなみに、PostgreSQLは、 vaccumで、deleteを再利用可能領域に変換する=>ファイルサイズ変更なし、 vaccum fullで、ファイルサイズ詰めです。SQLiteは、vaccumでファイル サイズも小さくなります。) 「deleteの後のトリガーに登録」?ということについては、 SQLiteをどのようなケースでご利用されているか、 (デスクトップアプリケーションの組込みDBか、Webアプリケーションのバックエンドか)わかりませんが、 deleteした時に、物理ファイル内のデータも削除しなくてはならないなど 特別な理由がない限り、vacuumの処理は、deleteのタイミングごとに行うというよりも、むしろデータベースのメンテナンスとして定期的にバッチ処理で行うのが一般的かと思います。 (vaccum処理対象のレコード数が多いと、それなりに処理に時間がかかるためです。) つまり、デスクトップアプリケーションならば、アプリ起動時や終了時に自動実行するか、ユーザがメニューから「最適化」処理として呼び出せるようにする、Webアプリケーションならば、サイトのメンテナンス日などにスケジューラで実行させる(Linuxならばcron、Windowsならばタスクから、vaccum処理を記載したプログラムを呼び出す)などです。
補足
copymasterさん、ご回答有難うございました。 >(vaccum処理対象のレコード数が多いと、それなりに処理に時間がかかるためです。) つまりは、sqlite3はvacuum処理中はトランザクション(selectやupdate,delete)を受け付けないのでしょうか?
補足
mattalixさん ご回答有難うございます。 vacuum知りませんでした。 deleteの後のトリガーに登録するんですか?