2012-03-19 5 views
4

私は、いくつかのものを挿入した後に私のCouchDBインスタンスをコンパクトにするたびに、サイズがかなり下がりました(時には20%まで落ちることもあります)。私はCouchDBデータベースをコンパクト化すると実際に何が起こっていますか?

私はすべてのデータを削除または変更していません。私は基本的に新しいレコードを挿入し、コンパクトでサイズが小さくなっています。

私はデータベースを圧縮しているときに実際に何が起こっていますか?何とかデータを圧縮していますか?それとも、新しいレコードにはいくつかのジャンクが付いてくるからです。それは後にコンパクトによって削除されますか?

+0

データを挿入するだけであっても、最後のクエリ以降にデータが変更されるたびにビューが更新されるため、無駄なスペースがかなり発生する可能性があります。しかし、これはただの推測です。 – biziclop

答えて

9

CouchDBは、追加専用ファイル形式を使用します。コードはこれまで決してfseek(3)を実行しません。最初から始まる.couchファイルの切り詰められた部分は、有効なデータベースファイルです。 (CouchDBは最後から逆方向にスキャンして "ヘッダ"を見つける)。

このアーキテクチャのコストは、変更するたびに多数の重複データを書き込んでいます。基本的には、新しいデータをファイルの最後に書き込んだ後、そのデータをデータツリーに組み込むために必要なすべてのメタデータの更新を書き出し、永続的にすべてをコミットする新しいヘッダーを書き込みます。

したがって、古い文書データはもちろんのこと、重複したメタデータ(内側のbツリーノードなど)がたくさんあります。.couchファイルに蓄積されています。もう一度、これは決してデータを上書きすることのない防弾技術に支払うことです。

圧縮すると、古い.couchファイルの関連データのみがスキャンされ、新しい.couchファイルに書き込まれます。 bツリーはバランスがとれており、古い文書はもう存在しません。それは素敵で清潔です。

+4

私のレコードは300GBのファイルを6MBまで圧縮しています。 (それは同じ数の文書の非常に高い更新率を持っていた) – JasonSmith

+0

うわー、それは...大規模なdbサイズになるとどれくらい時間がかかりますか? –

+0

ちょっと時間がかかりました。 CouchDBは、大きなファイルから "ライブ"データを掘り出し、それを新しいファイルに書き出し、ファイルの名前を変更しました。 – JasonSmith

関連する問題