5

私は、最終的に 2 GB のファイル サイズ制限に達するまで、データベースが静かに成長するという非常に奇妙な問題を発生させた Win32 アプリケーションに取り組んでいます。ADO を使用して Access 2007 データベースに接続します。このアプリケーションは何年もうまく機能しており、そのような問題は見られません。ご想像のとおり、2 GB の制限に達すると、データベースが破損します。現在、修理のために送られたかなりの数の顧客データベースがあり、サイズはすべて約 2GB です。圧縮すると、10 MB 未満に戻ります。

時間の経過とともにデータベースの成長が見られますが、そのような規模で成長することはありません.

すべてのレコードのすべてのフィールドの内容を合計して、実際のデータがどれだけ存在するかを把握する小さなデータベース「チェッカー」を作成しました。最近圧縮されたデータベースでこの新しいツールをチェックしたところ、ツールは正しく機能していると思います。肥大化したすべてのデータベースには、それぞれ 10 MB を超えるデータはありません。

アプリの起動時にデータベースを圧縮しません。大量のデータを削除するわけではないので、データベースの圧縮は「すべき」ことではないように思えます。大規模なデータベースを使用している顧客 (いくつかありますが、以前のバージョンを使用しています)。

10 MB 未満のデータベースを 2 GB に拡張する方法を教えてください。

私たちのアプリが何をするかについてのいくつかのコメント:

  • ADO でデータベースが開かれていない場合、再構築は DAO を使用して行われます。

  • いくつかの場所でトランザクションを使用します

  • 便宜上、特定のレコードは、検索/編集/削除する代わりに、削除して再作成すると便利です。通常、この操作には 5 ~ 30 のレコードが含まれ、各レコードは約 8K です。これは、ユーザーが [保存] を押したときにのみ発生します。

  • 約 70 KB/レコードの他のレコード タイプがありますが、削除/再作成は使用していません。

  • BLOB ("OLEObject") フィールドを使用してバイナリ データを格納します。

あなたが提供できる洞察に感謝します。

4

3 に答える 3

2

ご協力いただきありがとうございます。それが起こった場所を見つけました:

var
  tbl:ADOX_TLB.Table;
  cat:ADOX_TLB.Catalog;
  prop:ADOX_TLB.Property_;
begin
  cat:=ADOX_TLB.CoCatalog.Create;

  cat.Set_ActiveConnection(con.ConnectionObject);

  // database growth here
  tbl:=cat.Tables.Item[sTableName];

  prop:=tbl.Properties['ValidationText'];

  Result:=prop.Value;

  prop:=nil;
  tbl:=nil;
  cat:=nil;
end;

この関数が呼び出されるたびに、データベースは約 32KB 増加しました。

私はこの機能をあまり頻繁に実行するように変更し、ADO の代わりに DAO を使用して実行しました。

于 2013-11-28T18:39:58.893 に答える
1

少し調べてみたところ、データが削除された場合でも、圧縮されるまで MS Access ファイルがどのように大きくなるかについての議論に出くわしました。このことから、ファイル内にトランザクション履歴を保存していると推測されます。これは、アクセスごとに成長し続けることを意味します。

解決策は圧縮です。データベースを定期的に圧縮する必要があるようです。時間がかかる場合は、起動するのではなく、アプリケーションの終了時にこれを実行することをお勧めします。

また、これは、複数操作の変更 (上記の削除してから変更した値を再挿入するなど) により、ファイルがより迅速に拡張される可能性があることにも注意してください。

于 2013-11-06T22:47:28.240 に答える