<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97超入門>データベースの最適化



■データベースの最適化について考える

まずは、「データベースの最適化とは何か」ということからお話をしていこうと思います。

さて、こんな感じのシステムが形になって、運用を始めたら、どうしてもぶち当たる壁があります。

「いつのまにかデータベースがでかくなっていく・・・」

ひぇぇ・・・・。なぜ?

いや、しかし、勝手にでかくなっているわけではないのですが・・・。

これを知るためには、
  ・パソコンのハードディスク・メモリーの書き込みの仕組みや、
  ・パソコンのオペレーティング・システム(Windows95、98やNTなど)の中でのファイルの管理方法
を、大まかに把握する必要があります。
そして、それらのパソコンの環境と、リレーショナル・データベースというものと間にどんなギャップがあるのか。。。。
そのギャップを埋めるために、Accessのようなパソコンリレーショナル・データベースが、どんな無茶をしているのか・・・。

パソコンのディスクをいくら目を凝らしても、ただの金属でなんも見えませんが・・・・。
とにかく高速に読み取り/書き込みをするために、いろいろ工夫されてるわけですね。おそらく。

で、Accessのお話ですが、賢明な方ならおそらくこの辺で察しがついておられるかもしれません。
フツウ、ワープロの文章とか、表計算ソフトの表とか、「上書き保存をすると、保存され、保存しないで終了すると、保存前の状態のままである」んですよね。

ところが、Accessのテーブルというものは、レコード単位にどんどん更新されていく。
データを書き込んでいくときは、「保存」などということを意識しないはずです。

でも、外から見ると「在庫管理.mdb」なんていう名前の付いたいっこのファイル。
Access終了しちゃえば、ただのパソコンファイルです。
テーブルの中のレコードが1レコードずつ保存されてるわけじゃないです。

そんなこんなで、
  外から見るとただのパソコンファイル
  内側から見ると汎用機もビックリ本格SQLのリレーショナル・データベースでレコード単位の管理
という状態になっているわけですね。
今はもうこういうこと自体、珍しくも怪しくも何ともないんでしょうが、でもやっぱり、どっかでひずみが生じるはずなんです。


データベースを作っている最中、テスト的に書き込んだレコードをばーんと消したり、テーブルごと削除したり、とにかくレコードの削除って、頻繁に行いますよね。

削除したら、ファイルサイズが小さくなってる・・・。そう考えるのは当然です。
しか〜し。ぜんぜん小さくなってな〜い。ならないんです。

レコードは物理的になくなってるんです。でも、「レコードがあった場所」は、ぽっかり空いてるんです。
そう。ずーっと空きっぱなしなんです。
テーブルごと消しても、1件ずつ丁寧に心を込めて消しても、そーっと削除クエリーを実行しても、消えるのはレコードだけで、データベースは小さくならないんです。
すきまだらけの、スカスカでバカでかいデータベースになっていくのです。

いろいろ難しい仕組みがあるんでしょうが、とりあえず「ファイルサイズというのはWindows95などの基本ソフトの管轄下のもの。
Accessはレコード単位でリアルタイムにデータを更新していく」。
Accessの中でレコードやテーブルが削除されていても、基本ソフトには伝わらないのです。

なんとかならんもんかなぁといつもいつも思うんですが、いろいろ考えるとどうもしょうがない様子。じゃあ、どうする?

方法はふたつです。(厳密にはひとつですが)

1)MDEファイルにする。

2)データベースの最適化をする。

結局おんなじようなもんです。
MDEというのは、メニューバーの[ツール]→[データベースユーティリティー]→[MDEファイルの作成]によって作られるものです。
言うなればデータベースの実行環境だけのファイルにしてくれるってやつですね。
詳しくはオンラインヘルプを参照してください。
これはMDEファイルを作るときに、2)の「最適化」をやってくれるんで、結局Aと同じです。

さて、では、「データベースの最適化」とは何か。

すなわち前述の「削除したのにぽっかり空いてるスペース」をキレイにして、データベースを小さくというか、本来の大きさにする作業のことです。

ぜんぜんレコードの削除を行わない、あるいは、ほとんど行わないデータベースなら、別にやらなくてもどうってことないです。
大きくなっていく要素がないですからね。

問題は売上管理とか在庫管理とか、伝票のテーブルを半年ごとにきれーいに削除して、累積テーブルにデータを残していく、なんていう仕組みを作った時のお話。

厳密には増えてるわけじゃなくて、削除したところがプレスされないってことだけで、意味もなくがんがんでかくなっていくわけじゃないんで(生き物じゃないっすからね)、だいたいどれくらいの大きさになっていくのか、テストすれば予測がつきますが。まあ、でも、普段はそんなことあんまり気にしてられないですよねぇ。

で、問題の「最適化」です。これはどうやってやるのか。

メニューバーの[ツール]→[データベースユーティリティー]→[データベースの最適化]

これを実行します。マニュアル操作です。

作ったデータベースが、どれくらいのファイルサイズなのか見てみましょう。
見方はいろいろあります。いったんAccessを終了させ、例えばエクスプローラなど(インターネットエクスプローラじゃないですよ)の、ファイルを管理するツールで見てみるとか、アイコンを詳細表示にするとか、方法はお任せします。

例:(最適化前) (最適化後)

で、もう一回「在庫管理.mdb」を開きます。開いたら、上記「データベースの最適化」を実行してみます。

よーく見ておいてください。なんかデータベースウィンドウが一回消えて、また出て来てますね。
画面の右下にステータスバーというところがありまして、ここに「データベース最適化・・・・・」とかなんとかメッセージが出てるだけで、なにやってるかようわかりません。

終わったらさっさとまたAccessを閉じて、再び「在庫管理.mdb」の大きさを確認してみてください。

変ってます?小さくなってます?


肥大したテーブルをきれいにする方法は、はっきり言ってこれしかありません。他に方法はないのです。

メニューバーからカンタンに実行してますので、「じゃあ、これをマクロとかプロシージャで実行できるようにして、メインメニューから自動的に・・・」
と、考え付きますよね。とうぜん。

技術的にはできないことはないのですが、もし、自動化したいという目的が「操作が覚えられないから」とか「めんどうだから」とか「よくわかんないから」とかいうんでしたら、自動化はやめた方がよいのではないかな、と思います。いやな言い方になってしまいますが、こればかりはあまり気軽な気持ちで取り組まない方が無難です。

なぜ自動化が必要なのか、そのあたりを理解しておられる方なら、問題ないと思うんですが・・・。


「データベースの最適化」って、一体なにをしているんでしょう。

vbaで使うコマンドにCompactDatabaseというのがあります。これを実行しているのです。

なーんだ、カンタンじゃんと思うなかれ。このCompactDatabaseというやつは「閉じているデータベースを最適化する」コマンドなのです。

「最適化」といっても、前に述べたように、削除して空欄になった部分を詰めるという作業をします。
どうやってやるかというと、まったく同じデータベースを作ってるんです。
厳密には、削除した空欄をキレイにしているのではなく、新しいデータベースをもういっこ作って、そっちに移すときにキレイにしているんです。

つまり、複製を作って、もとのデータベースを削除して、複製の方にもとのデータベースと同じ名前を付けてるわけです。
そんなもんなんですよ〜。で、複製を作るときにCopyじゃなくて、CompactDatabaseというコマンドを使って、虫食い状態を整えてるんです。
したがって、「データベースの最適化」を行うときは、一時的にそのデータベースがふたつになるのです。

開いているファイルを削除することって、できます?Access以外のソフトだって、開いてる最中に削除はできないでしょう。
お花見に行って、自分が座ってるござをたたもうとして、「あれ、たためない?なんで?」って言ってるようなもんです。

「閉じないと、最適化できない」

「最適化」そのものは、CompactDatabaseというコマンドの使い方さえ理解できればすぐできます。
しかし、その前に「自分自身を閉じる」という離れ業をやってのけないといけないので、そこが難しいわけなんです。

「自分自身を閉じる」。閉じた後もなお、動きつづけることができるプロシージャとかマクロって、どうやって作るやら・・・。
できませんよねぇそんなの。

実際にメニューバーから[最適化]を実行すると、いったん閉じて、複製を取りながら最適化をして、もとのを削除して・・・という作業をやってるわけですね。
で、Accessのメニューバーからのコマンドですから、あたかも閉じたデータベースをまた開いてるような、そんな動作をしているわけです。

これと同じ動作を、ユーザーが作り込むことは、残念ながら現状ではできません。


と、同時に、やすやすと自動化をするものではないのだと、わたしはそう解釈しています。

一時的にファイルが2つになるのです。もし、データベースが100mbあったら、200mb以上の容量を食うと思ってください。
100mbだったものが50kbくらいにちっちゃくなる可能性もあります。
100mb→50kb。。。最適化が完了するまで、おそらく数分から十数分かかるでしょう。
その間、うっかり他の操作をしていてハングしてしまったりしては、データベースはおしゃかになってしまいます。

メニューバーから[最適化]を実行する・・・。本当はこれが一番正しく安全な方法。わたしはこれが一番正しいやり方だと考えてます。