Accessデータベースの最適化について

このQ&Aのポイント
  • Accessデータベースの最適化についてご質問させていただきました。最適化後のdbのサイズについて疑問があります。
  • 最適化の方法としては、メニューにあるボタンを押すだけで行えますが、d‌bのサイズがほとんど変わらないという問題が発生しています。
  • 直接データベースを開いて最適化を行うと、サイズが劇的に小さくなるのですが、ユーザーが直接アクセスすることを避けたいと考えています。解決策をご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
回答を見る
  • ベストアンサー

最適化後のサイズがあんまり変わりません。

こんにちは。 先日、Accessにてリンクテーブルの削除、dbの最適化、リンクの張りなおしについて質問させていただいたものです。 結局、リンクテーブルを削除しなくても最適化ができましたので、とりあえずOKなのですが、最適化後のdb のサイズについて質問があります。 最適化の方法としては、メニューにあるボタンを押したら、 1.元データ(a.mdbとします)のバックアップ(bk.mdbとします)を取る(filecopyで行っています) 2.a.mdbの最適化を行います(最適化してできたdb をwk.mdbとします)。 3.wk.mdbをa.mdb元データの名前でコピーします。 4.wk.mdbを削除します。 実験のために、元のa.mdbのサイズを大きくして、上記の処理を行ってみたのですが、dbのサイズがほんのちょっとしか小さくなっていません。何回やっても同じです。 しかし、直接a.mdbを開いて、ツール→データベースユーティリティ→最適化 を行うと、びっくりするほどサイズが小さくなるのです。 これでは、最適化をメニューにつける意味がありません。しかし、ユーザーがa.mdbを直接開くことは避けたいので、解決策をご存知の方がいましたら、回答よろしくお願いします。 ちなみに、データ用のDTとそれ以外のプログラムのDTは分けています。Access2000、ADOで使用したいです。

  • satie
  • お礼率90% (246/273)

質問者が選んだベストアンサー

  • ベストアンサー
  • vantage
  • ベストアンサー率60% (310/514)
回答No.2

今、過去質問を見てきたのですが、 最適化しようとしているのはデータ.mdbの方ですよね。とすると、テーブルリンクしているだけのこのmdbのオブジェクトが肥大するということはないんじゃないでしょうか?  実施されたテストでは、何らかの方法でmdbのファイルサイズを大きくされたようですが、その過程でゴミが溜まり、その分がオブジェクトの最適化できれいになったという現象ではないでしょうか。 >データベースとオブジェクトを最適化するコマンド ・・・につきましては、他のmdbに対しての方法はないと思います。 というわけで、処理としてはこのままでよいと思います。ユーザに配布する前にメニューから「最適化」を実行し、運用中はVBAからCompactDatabaseを終了時に実行ということでよいのではないでしょうか。 なお、蛇足ながら >3.wk.mdbをa.mdb元データの名前でコピーします。 >4.wk.mdbを削除します。 ・・・という処理は、良くある最適化の手順では >3.a.mdb を削除 >4.wk.mdb を a.mdb にリネーム という手順をとることが多いようですよ。  

satie
質問者

お礼

こんにちは。わざわざ以前の質問を見てくださったのですね。ありがとうございます。 書き方が悪くて失礼しました。私の質問の中であげているa.mdbというのは、テーブルのみが入っているdbのことで、プログラムを格納しているdbを肥大化させたということではありません。オブジェクトを最適化するコマンドはないのですね。わかりました。 それと、最適化の手順を書いていただきましたが、こちらのやり方のほうがメリットがあるのでしょうか?(データベースが壊れにくい、とか)質問攻めですみません。

その他の回答 (2)

  • vantage
  • ベストアンサー率60% (310/514)
回答No.3

>こちらのやり方のほうがメリットがある いやぁ、余計なこと書いちゃいましたかね~。 多分どっちでもいいんでしょうけどね。 (だったら言うな!(笑)) 私自身が、その他の処理でも[削除]→[リネーム]のやり方を良く使うのと、ちょっと参考に覗いたいくつかのサイトでの最適化処理でも全てがこっちのやり方だったので・・・ ちなみに本職プログラマーの方が[コピー]→[ワーク削除]としている例もありました。 厳密言えば [削除]→[リネーム] の方が処理が早そうな気もしますが・・・。

satie
質問者

お礼

こんにちは。何回も回答してくださって、ありがとうございます。今回は、あまり工数をかけられないので、今のままで良しとします。どうもありがとうございました。

  • vantage
  • ベストアンサー率60% (310/514)
回答No.1

「最適化」というのが、VBAから CompactDatabase を実行ということでしたら、これはメニューの「最適化」とは別の動作です。 メニューの「最適化」→ データベースとオブジェクトを最適化 CompactDatabase → データベースだけを最適化 当然、結果としてのファイルサイズも異なることになります。

satie
質問者

お礼

こんにちは。早速の回答ありがとうございます。CompactDatabaseがデータベースのみ最適化するなんて知りませんでした。あつかましいですが、メニューの最適化同様、データベースとオブジェクトを最適化するコマンドをご存知でしたら教えていただけないでしょうか?(オブジェクトのみでも、CompactDatabaseとあわせてやれば問題ないですよね?)

関連するQ&A

  • Accessにてリンクテーブルの削除、最適化、リンクの張り直しを行いたいのです。

    こんにちは。 Access2000でプログラムを作成しています。その際、データ(テーブル)の入っているmdb(DT.mdbとします)と、テーブル以外のプログラムが入っているmdb(PG.mdbとします)に分けて、PG.mdbにテーブルをリンクしています。 データがどんどん大きくなるので、最適化をしようと思うのですが、プログラムのほうは、ツールのオプションで、「閉じるときに最適化を行う」にチェックを入れたので解決です。 DT.mdbの方はリンクしているため、プログラムのメニュー上にある「最適化」のボタンを押したら、いったんリンクを解除して、最適化を行い、もう一度リンクを張りなおす、という処理を行いたいのですが、書き方がわかりません。 今まではDAOを使用していて、DAOでの書き方はわかるのですが、このプログラムはADOで書かれており、しかもほかの人が作ったものなので解読に時間がかかってしまいます。一応、DT.mdbへの接続などはできているようです。 あと、PG.mdbの方では、ワークテーブル(データではない、一時的に利用したい)的なものは、使用できないのでしょうか?レコードセットをオープンしようとしたらエラーになってしまいましたので。 どなたかよい方法をご存知の方、回答よろしくお願いします。

  • データサイズが大きいAccessファイルの編集について

    こんにちは。 Accessで開発をしていて、気が付いたら200MBを超えるサイズになっていました。 そこで、バックアップ用に作っていたテーブルやクエリを削除しようとしたら強制終了が発生し、 db1.mdbというバックアップファイルのようなものが作成されました。(元ファイルと同サイズ) db1.mdbを削除しようとしたら、共有違反で削除できず、元ファイル自身もその現象が起きます。 セーフモードで起動し、DOS経由で削除も試みたのですが、「他のプロセスが使用中です」とでてしまい、 結局削除できません。 これが解決しないと、次の仕事が出来ないので、非常に困っております。 どなたか、解決策をご存知の方、ご教授願います。

  • エクセルからアクセスへADO 「_be.mdb」に追加するべき?

    リンクテーブルでtest.mdbとtest_be.mdbに分割した場合 エクセルからアクセスへADOでテ゛ータを追加する場合、 「test.mdb」と「test_be.mdb」のどちらに追加すればいいのでしょうか? 「test_be.mdb」はリンクテーブルとして「test.mdb」のテーブルのみ保存されています。

  • マスタデータ更新

    こんにちは。 システム開発の基礎的なところがわからないので、教えていただきたく、投稿させていただきます。 システム開発をほとんどやったことがないので、言葉が変なところもあるかと思いますが、宜しくお願いいたします。 サーバー上に、AというSQLServerのDBがあります。 今までは、システム管理者のみがAccessからA.DBのリンクテーブルを使い、マスタデータの更新/追加/削除を行っていましたが、今後、リーダークラスの人もできるようにしたい!という要望があり、そのインターフェース部分を作成しています。 いろいろと考え、フロントエンド側にAccessでB.mdbを作成し、そこには、A.DBと同じテーブル構造の一時TBLを作成し、B.mdbを開いた時にA.DBから全データを取得することにしました。(取得するところまではできています) ここから、設定するための画面作成をしますが、最終的に、更新/追加/削除されたデータは、どのようにA.DBにUPすればいいのでしょうか? 考えた方法として (1)B.mdb内に、一時テーブルとは別に、更に同じ構造の変更用テーブルを作成。 設定画面から更新/追加/削除されたデータは変更用テーブルに保存し、全ての処理が終了したら、変更用テーブルにあるデータを1つづつ見て、A.DBへ更新/追加/削除をかける (2)一時テーブルのデータを直接更新/追加/削除し、全ての処理が終了したら、全テーブルのレコードを1件づつ比較し、A.DBへ更新/追加/削除をかける というくらいしか思いつかないのです。 その他に思ったのが、一時テーブルもしくは変更用のテーブルに、レコード毎に「更新/追加/削除」がわかるようにフラグを設けて、そのフラグに従ったSQL文を発行する というくらいです。。。 根本的に、マスタデータに対する更新/追加/削除のやり方が間違っていたりしますか? 誰も聞ける人がいないので、どうぞ宜しくお願いいたします!!!

  • ACCESSリンクテーブルでデータを入力しても表示されない。

    ACCESSリンクテーブルでデータを入力しても表示されない。 MS ASSECC2003を使っています、 ORG_data.mdbに元データがあります USER.mdbからリンクテーブルで上記ORG_data.mdb のテーブルを参照しています。 USER.mdbを開いてORG_data.mdbのテーブルに新規データを追加しても USER.mdbをいったん閉じて再度開かないと追加されたデータが見えません 元データのORG_data.mdbのテーブルにはデータが追加されいますが、 リンクテーブルの設定とかあるのでしょうか? USER.mdbで追加したデータがすぐに更新されて見れる方法はありませんか? どなたかお知恵を拝借させてください。 リンクテーブルで参照

  • アクセスのデータを取り込みたい

    アクセスのデータを取り込みたい アクセスのクエリも理解できない、超初心者です。 db1.mdbのテーブル1のA列B列のデータだけをdb2.mdbのテーブル2に取り込みたいのですが、やり方が分かりません。先輩に聞いたら、マクロを使えば簡単だよ、あとは自分で調べなと言われ、まったく見当がつきません。 どなたかご教授願います。よろしくお願いいたします。

  • Accessのテーブルへのリンク

    いま、ASPのDBとして使っているAccessのファイル A.mdbがあります その中の一つのテーブルを別のAccessファイル B.mdbにリンクして、参照したいと思っています。 しかし、B.mdbからリンクするときに インポートすると、A.mdbの変更が反映されず、 リンクすると、B.mdbで変更したものがA.mdbにも反映されて困っています. やりたいことはB.mdbから安全に(変更なしで)A.mdbのテーブルを 閲覧したいのです. ・A.mdbの変更をB.mdbに反映したい ・B.mdbのテーブルの変更はA.mdbに影響がない と言うことです. どうかお力添えを よろしくお願いします.

  • VBAでAccessのテーブルのエクスポート・インポートをするには。

    すみませんが、教えてください。 Excel+VBAで、AccessをSQL,ADO,ADOXで操作しようとしています。 a.mdbのテーブルを、b.mdbに、エクスポート(インポート)したいのですが、やり方がわからず困っています。 すみませんが、テーブル構造のみをエクスポートする方法、データを含めてエクスポートする方法を教えてください。

  • Access起動中にエクセルからADOでデータの更新ができない

    こんばんは。原因がわからないので質問させてください。 SQLサーバーのデータをAccessのmdbへリンクテーブルしています。 (SQLサーバー → Access) 全て一つのパソコンで行なっています。(LANには接続していません) Accessのmdbファイルを起動している時に ExcelからSQLサーバーのAccessにリンクしている上記のテーブルへ ADOを使ってデータを追加しています。 (Excel → Access)  しかし、「rs.Update」の部分で  「ODBC--リンク テーブル'テーブル1'での更新に失敗しました。」 となってしまいます。 なので、一度mdbファイルを落として、コードを再開すると通るので ADOでExcel → Accessにデータを追加し終わってから再度mdbファイルを立ち上げています。 また同じ状態(mdbファイルを起動)で Excel → SQLサーバー へ更新クエリをしようとすると「時間切れになりました」となります。 (こちらもmdbファイルを落とすと再開できます。) いちいちmdbファイルを落とすのめんどうなのですが 回避する方法はありますか? cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Users\Documents.test.mdb" rs.Open "テーブル", cn, adOpenStatic, adLockPessimistic rs("フィールド") = True rs.Update '保存 rs.Close: Set rs = Nothing というコードを書いています。 Accessを落とせば正常に動きます。 ご教授よろしくお願い致します。

  • AccessでのリンクテーブルとADO等の使い分け

    同時接続数5程度の備品管理をしたいと思っています。 共有フォルダーとAccessで構築しようと思っていますが、いずれはDBをSQLサーバなどにしたいと思っています(その前にMSDEかもしれません)。 容易にDBを変更できるようにする方法として下記の2つを考えています。  1.リンクテーブルを用いてMDBからSQLサーバに切り替える。  2.ADOを用いる。 "2"を用いることにこしたことはないと思いますが、"1"が簡単なので、どちらにしようか悩んでいます。"1"の問題となる点がありましたら教えてください。

専門家に質問してみよう