データベースを最適化する方法

◆概要
 この資料は、Microsoft Access でデータベースを最適化する方法を記載しています。

◆詳細

Accessでは、データベースの性能を維持するため、データベースが閉じられ、破棄されたページが最適化されるまで、破棄されたページは削除されません。そのため、最適化されるまで余計なディスク容量が必要となります。


データベースを最適化するときは、次のような処理が行われます。


  • テーブルの各ページが連続したデータエース ページになるように再調整されます。この操作を行うと、データベース テーブルの断片化が解消され、パフォーマンスが向上します。テーブル上に主キーが設定されている場合は、主キーの順にレコードがコピーされるので、先読みが効率的になります。これには、Microsoft SQL Serverのクラスタ化インデックスと同様の効果があります。ただしクラスタ化インデックスとは異なり、Accessでは、データベースの最適化後にユーザーがレコードの追加、削除または修正を行う場合には、主キーの順番は保たれません。テーブルに主キーが設定されていない場合は、レコードはファイルに格納されている順序でコピーされます。
  • オブジェクトやレコードを削除した結果生じた未使用領域を再利用します。オブジェクトやレコードがデータベースから削除されると、それらが占有していた領域は使用可能になりますが、データベースのサイズは小さくなりません。データベースを最適化すると、サイズが小さくなります。
  • オートナンバー型のフィールド(Access Version 1.1 および2.0以前ではカウンタ型のフィールド)のインクリメント値をリセットし、次に割り当てられる値が、最後のレコードの番号の次の番号になるようにします。
  • クエリーの最適化処理で使われたテーブルの統計情報を再作成します。この統計情報は、トランザクションのロール バックやデータベースが正しく閉じられなかったことなどにより、時間が経つにつれて古いものになります。
  • すべてのクエリーにフラグを立てて、次回実行されるときに再コンパイルされるようにします。データベースの統計情報は変化し、前にコンパイルされたクエリーに不正確な最適化情報が含まれる可能性があるので、このことは重要です。

 データベースを最適化するには、データベースを閉じ、[ツール]メニューの[データベースユーティリティ]をポイントし、[最適化]をクリックします。最適化するデータベースが開いている場合は、一度閉じられ、一時ファイル上で最適化され、再び開かれます。最適化するデータベースが閉じている場合は、最適化元のデータベース名と最適化後のデータベース名を指定する必要があります。両方の名前が同じ場合は、一時ファイル上で最適化されます。最適化が完了すると、一時ファイルは元のファイル名に変更されます。

 DBEngineオブジェクトのCompactDatabaseメソッドでデータベースを最適化することもできます。CompactDatabaseメソッドを使う場合、最適化先のデータベースには、別のファイル名を指定する必要があります。次のコード例では、CompactDatabaseメソッドを使い、データベースが一時ファイル上で最適化され、最適化の完了後、その一時ファイル名が元のファイル名に変更されます。

◆リスト1 データベースを最適化する

Sub CompactDB()
' データベースを最適化する
    On Error GoTo CompactDB_Err
    Const ConfilePath = "C:\RiceVisor\"
    
    ' 一時ファイル上でデータベースを最適化する
    DBEngine.CompactDatabase ConfilePath & "rvdata.mdb", _
        ConfilePath & "rvdataTemp.mdb"
    
    ' 以前のバックアップ ファイルが残っている場合は、削除します。
    If Dir(ConfilePath & "rvdata.bak") <> "" Then
        Kill ConfilePath & "rvdata.bak"
    End If
    
    ' カレント データベースにバックアップとして別の名前を付け、一時ファイルに
    ' 元のファイルの名前を付けます。
    Name ConfilePath & "rvdata.mdb" As ConfilePath & "rvdata.bak"
    Name ConfilePath & "rvdataTemp.mdb" As ConfilePath & "rvdata.mdb"
    MsgBox "最適化が完了しました。"
    
Exit_CompactDB:
    Exit Sub

CompactDB_Err:
    MsgBox Err.Number & Err.Description
    Resume Exit_CompactDB
        
End Sub



▼ページトップに戻る