2012-02-10 3 views
1

どうすれば可能ですか? SQLite3を使ってレコードをINSERT/DELETEする単純なC++アプリケーションがあります。 私は内部に単一のデータベースと単一のテーブルを使用します。その後、私はdbにいくつかのデータを格納することを選択した後、それが行われ、my.dbのサイズは自然に増加します。Sqlite3/C++はdbサイズを変更せずにDELETE文を実行します

DELETEに問題がありますが、そうではありません。しかし、私がしなければ:

sqlite3 my.db 
sqlite> select count(*) from mytable; 

そこは0大丈夫である戻されますが、my.dbがを含むフォルダにls -lをすれば、サイズ は同じです。

誰でも説明できますか?

+0

これが問題だと思われる理由を説明してください。確かにその概念は、あなたの文書を読んだことから来るものではありません。 –

+0

http://www.sqlite.org/lang_vacuum.htmlでは、実際に削除すると空白が残ることが説明されています。 VACUUMを実行してDBを再構築し、スペースを再利用することができますが、そのページのROWIDについてのメモを認識することができます。 – Joe

+0

SQLiteよくある質問:[(12)大量のデータを削除しましたが、データベースファイルが小さくなりませんでした。これはバグですか?](http://www.sqlite.org/faq.html#q12) –

答えて

4

DELETEクエリを実行すると、Sqliteは実際にレコードを削除してデータを再配置しません。それはあまりにも時間がかかるでしょう。代わりに、削除されたレコードに印を付け、それ以降は無視します。

実際にデータサイズを小さくしたい場合は、VACUUMコマンドを実行してください。自動掃除のオプションもあります。 http://www.sqlite.org/lang_vacuum.htmlを参照してください。

4

シナリオはSQLite Frequently Asked Questionsにリストされている:

(12)Iは、大量のデータを削除したが、データベース・ファイルには任意の が小さく取得できませんでした。これはバグですか?

いいえSQLiteデータベースから情報を削除すると、未使用のディスク領域が内部の空きリストに追加され、次にデータを挿入するときに再利用されます( )。ディスクスペースは失われません。しかし、どちらも はオペレーティングシステムに返されません。

多くのデータを削除してデータベースファイルを縮小する場合は、VACUUMコマンドを実行してください。 VACUUMは のスクラッチからデータベースを再構築します。これにより、データベースには空の空きリストと最小サイズの ファイルが残されます。ただし、VACUUMは実行するのに少し時間がかかります( SQLiteが開発されたLinuxボックスでメガバイトあたり約0.5秒かかることがあります).の一時ディスク容量を元のファイルとして最大2倍まで使用できますが走っています。 SQLiteバージョン3.1のよう

VACUUMコマンドを使用する代わりに、自動真空モードである、auto_vacuum pragmaを使用可能にしました。

ドキュメントはお友達です。 をご利用ください。the documentationからも


情報がデータベースに削除され、BTREEページは 空になる、それはデータベースファイルから削除されていませんが、その代わりとして をマークされています将来の使用のため「無料」。新しいページが必要な場合、データベースサイズを増やす前に、SQLiteはこれらの空きページのいずれかを で使用します。この は、データを格納するのに必要なサイズを超えてファイルサイズが を超えるデータベースの断片化を招き、データそのものがファイル内で混乱するようになります( )。

動的データベースの別の副作用は、テーブルの断片化です。個々のテーブルのデータを含む ページは、データベースファイルを介して に広がってしまい、読み込みに時間がかかることがあります。これは、ファイルシステムの動作のために、明らかに遅いデータベース速度になる可能性があります。 圧縮はこれらの問題の両方を修正します。

空のページを削除する最も簡単な方法は、SQLiteコマンド VACUUMを使用することです。これは、SQLiteライブラリ呼び出しまたは sqliteユーティリティから実行できます。

詳細な例を示します。

+0

だから、あなたは私の答えを削除しています。それがあなたの復讐ですか?ああ、はい、私のリンクからあなたの答えにコピーされた内容ですし、私の答えを削除します。それは汚れている。恥を知れ。 –

+0

@EvgenBodunov:私はあなたの答えを削除しなかったし、あなたの答えから何の内容もコピーしなかった。あなたの答えは司会者(casperOne)によって削除されました。なぜなら、[リンクは答えではない](http://meta.stackexchange.com/questions/116301/how-should-helpful-answers - これはちょうど処理されるリンクです)。リンクを使用して回答を補完することができますが、回答は役に立つ情報の自己完結型バーストでなければなりません。その情報が引用の形式をとっていれば、それは問題ありません(ソースが引用されている限り)。 –

+0

@EvgenBodunov:結論に飛びつき、事実がなくても私を非難し、積極的であることをあなたに恥をかかせます。 –

関連する問題