この章では、OracleとMicrosoft Accessを連携させる場合のチューニングおよびカスタマイズについて説明します。
この章の内容は次のとおりです。
Oracleでは、多くのODBCドライバを使用できます。オラクル社が提供するドライバに加えて、Microsoft社、Visigenic社、MERANT社などのドライバを使用できます。
ODBCドライバによってパフォーマンスが異なる場合があります。大規模なアプリケーションを構築する場合は、そのアプリケーションに様々なODBCドライバのプロファイルを設定する必要があります。パフォーマンスを判断する最適な方法は、ODBCまたはOCIスパイ・プログラムを使用することです。これらのプログラムを使用すると、Microsoft Jetデータベース・エンジンからODBC APIへのコールが示されます。また、Oracle ODBCドライバからOCIへのコールも示されます。
フロント・エンドにMicrosoft Accessを使用するOracle Databaseを管理する場合は、MSysConfという専用のパラメータ表をOracle Databaseに作成し、Microsoft AccessアプリケーションとOracle Database間の通信を制御できます。Microsoft AccessからOracle Databaseへ初めて接続が行われる際、接続するOracleユーザー・スキーマにMSysConf表が存在するかどうかが確認されます。MSysConf表を使用すると、リンクされた表内にユーザー・ログオン情報を格納しないようにできるため、アプリケーションのセキュリティが向上します。また、MSysConf表を使用して、レコード検索機能を最適化できます。次の表に、Oracle内のMSysConf表の構造を示します。
| 列 | データ型 |
|---|---|
Config |
|
chValue |
|
nValue |
|
Comments |
|
次の表に、Config列およびnValue列の値を示します。これらの値を使用して、Microsoft AccessとOracleを連携させる方法をカスタマイズできます。
| Config | nValue | 説明 |
|---|---|---|
| 101 | 0 | ユーザーが、リンクされた表にUSERIDおよびPASSWORDを格納することを禁止します。 |
| 101 | 1 | ユーザーが、リンクされた表にUSERIDおよびPASSWORDを格納することを許可します(デフォルト)。 |
| 102 | D | 検索と検索の間をD秒遅延させます。 |
| 103 | N | 各検索でN行フェッチします。 |
デフォルト設定を使用する場合でも、各Oracle DatabaseにMSysConf表を作成することをお薦めします。これによって、後でMSysConf表の値を変更するために、この表を作成して名前を付ける方法を覚えておく必要がなくなります。
Microsoft Accessをチューニングして、アプリケーションの起動時にODBC接続を確立する処理を高速化できます。Microsoft AccessがODBCデータベースに接続する際、特定のODBCドライバによって提供される機能のレベルが判断されます。セキュリティにOracleの機能のみを使用している場合、Microsoft Accessのユーザー、グループおよびパスワード情報を使用した、Microsoft AccessによるOracleへのログインをバイパスできます。
ログイン認証をバイパスするかどうかは、TryJetAuth属性の値によって決定されます。TryJetAuth属性のデフォルト値(1)を使用すると、Microsoft Accessは、Microsoft Accessのログイン情報を使用して、Oracle Databaseへの接続を試行します。Microsoft Accessのログイン認証をバイパスするには、TryJetAuth属性を0(ゼロ)に設定する必要があります。これによって、Oracleへの初期接続時間が1から2秒間短縮されます。
Microsoft Access 97およびMicrosoft Access 2000では、レジストリ・エディタ(regedit)を使用してWindowsレジストリを変更します。表5-1に、システムにインストールされたMicrosoft Accessのバージョンに応じたレジストリ・キーの場所を示します。
Microsoft AccessのフォームおよびレポートがOracle Database内に存在するデータに対して機能するように、SQL Developerは、Microsoft AccessデータベースにODBCリンク表を生成します。このODBCリンク表は、Oracle Database内の表を参照します。Microsoft AccessアプリケーションでODBCリンク表を使用すると、パフォーマンスが低下します。具体的には、一部のODBCデータソース情報をODBCリンク表オブジェクトにキャッシュすることによって接続時間は短縮されますが、ODBCリンク表を使用したDML操作の実行速度は遅くなります。
CurrentDBオブジェクトは、Microsoft Access VBAコード内で、データベース情報を参照するために広範囲に使用されます。移行前は、CurrentDBオブジェクトはローカルのMicrosoft Accessの表を参照します。SQL DeveloperでMicrosoft Accessデータベースを変更した後は、CurrentDBオブジェクトはODBCリンク表を参照します。
Microsoft Jetデータベース・エンジンでのODBCデータソースの操作を高速化するには、ODBCリンク表が可能なかぎり直接使用されないようにする必要があります。これを行う方法の1つは、VBAコード内で、CurrentDBオブジェクトのかわりにJetワークスペースのDatabaseオブジェクトを使用することです。Databaseオブジェクトは、ODBCリンク表を参照しません。かわりに、このオブジェクトでは、Oracle表への直接接続が必要です。
CurrentDBオブジェクトとDatabaseオブジェクトの両方で公開されているプロパティおよびメソッドは同じであるため、VBAコードで必要な変更は最小限で済みます。
CurrentDBオブジェクト参照をDatabaseオブジェクト参照に置き換えるには、次の手順を実行します。
Database型のグローバル変数を作成します。次に例を示します。
Global dbOracle As Database
次に示すように、初期化中にOracle Databaseへの接続を作成して、Databaseオブジェクトを作成します。
Dim dsn As String Dim uid As String Dim pwd As String Dim odbcConnectStr As String dsn = "ora817" uid = "system" pwd = "manager" ' build up the connect string odbcConnectStr = "ODBC;DSN=" & dsn & ";UID=" & uid & ";PWD=" & pwd ' use Microsoft JET Workspace to make a connection to the Oracle database Set dbOracle = DBEngine.Workspaces(0).OpenDatabase(dsn,_ dbDriverCompleteRequired, False, odbcConnectStr)
CurrentDBに対するすべての参照をdbOracleに対する参照に置き換えます。
|
注意: Databaseオブジェクトは直接Oracle表を参照するため、表を操作する際には、Microsoft Accessの表名ではなくOracleの表名を指定することが重要です。Microsoft AccessデータベースとOracle Databaseで適用されるオブジェクトのネーミング制限が異なるため、両方のデータベースで異なる表名を使用できます。 |
Microsoft AccessからODBCリンク表を削除することはできません。VBAコードでODBCリンク表が参照されなくなっても、データベース内のフォームおよびレポートは、ODBCリンク表を直接参照しているためです。ODBCリンク表を参照しないようにフォームおよびレポートを変更するには、煩雑な作業を行う必要があります。すべてのレコード・ナビゲーションおよびレコード操作の再プログラミングに加えて、フォームおよびレポートの再コーディングが必要です。これらの変更を行っても、Microsoft Jetデータベース・エンジンはバイパスされません。Microsoft Jetデータベース・エンジンは引き続き使用されるため、Oracle Databaseからレコードを取得する際に全表スキャンが実行されます。Microsoft Jetデータベース・エンジンのボトルネックを取り除く方法については、「Microsoft Jetデータベース・エンジンの排除」を参照してください。
ODBCデータソースを使用するMicrosoft Accessアプリケーションのパフォーマンスが大幅に低下する主な原因は、Microsoft Jetデータベース・エンジンです。Microsoft Jetデータベース・エンジンには、表の問合せが実行されるたびに全表スキャンが実行されるという問題があります。そのため、Microsoft AccessのフォームまたはレポートがODBCリンクを介してOracle表を参照する場合、Microsoft Jetデータベース・エンジンは、問合せの実行前に、表のすべての内容をローカル・メモリーに取得する必要があります。多くの場合、Microsoft Jetデータベース・エンジンを排除すると、元のMicrosoft Accessアプリケーションより高速になります。
Microsoft Jetデータベース・エンジンのかわりに、ODBCDirectを使用することもできます。ODBCDirectでは、移行先Oracle Databaseへの接続のみを表すConnectionオブジェクトが使用されます。ODBCDirectを使用する場合、Microsoft Jetデータベース・エンジンはロードされません。ODBCDirectを使用すると、すべてのSQL文は、変更されずにOracleサーバーに送信されて操作されます。SQL文はOracleサーバーで評価および解析されるため、ネットワーク通信量は大幅に減少します。問い合されたレコード情報のサブセットのみが、ネットワークを介してMicrosoft Accessアプリケーションに戻されます。
ODBCDirect Connectionオブジェクトを使用するようにVBAコードを変更する手順は複雑です。Connectionオブジェクトと、CurrentDBおよびDatabaseオブジェクトでは、使用されるプロパティおよびメソッドが大きく異なります。また、SQL文はネットワークを介してOracleサーバーに送信されて操作されるため、正しいOracle構文でSQL文を記述する必要があります。そのため、次の操作の実行を検討する必要があります。
Oracle SQL構文に準拠するように、VBAコード内のすべてのSQL文を変更します。
Microsoft Access固有の式を含むSQL文をOracleの構文に変更します。
SQL文で使用されているMicrosoft Accessの組込み関数を、Oracleの同等のファンクションに置き換えます。
CurrentDB or Databaseオブジェクト参照をConnectionオブジェクト参照に置き換えるには、次の手順を実行します。
グローバルODBCDirect Connectionオブジェクト参照を次のように作成します。
Global connOracle as Connection
ODBCDirectワークスペースを次のように作成します。
Dim DSN As String Dim UID As String Dim PWD AS String DSN = "ora817" UID = "system" PWD = "manager" wsODBC = DBEngine.CreateWorkspace(DSN, UID, PWD, dbUseODBC)
次に示すように、Oracle Databaseに接続して、ODBCDirect Connectionオブジェクトを作成します。
Dim ODBCconnectStr AS String ' build up the connect string ODBCconnectStr = "ODBC;DSN=" & DSN & ";UID=" & UID & ";PWD=" & PWD ' open a connection to the Oracle database Set connOracle = wsODBC.OpenConnection(DSN, dbDriverCompleteRequired, False, ODBCconnectStr)
Oracle Databaseでデータを操作するには、次に示すように、SQLコマンドをOracleサーバーに直接渡して処理します。
Dim sql As String set sql = "select * from emp where empno > 10" connOracle.execute sql
必要な列のみを表に問い合せることによって、ネットワーク通信量を削減できます。また、可能なかぎり最も厳しい条件を使用して、問合せの結果セットのサイズを削減する必要があります。
可能であれば、Oracleデータの操作では順方向スナップショットを使用します(特に結果セットが小規模な場合)。大規模な結果セットおよび更新する必要がある問合せの場合、ダイナセットを使用します。データを更新しない場合でも、大規模な結果セットでは、ダイナセットの方がスナップショットより高速です。
ドロップダウン・リスト・オプションに項目を移入する必要がある場合、Microsoft Accessでは、ネットワーク通信量ができるかぎり少なくなる方法が試行されます。スナップショットを使用してドロップダウン・リストを移入すると、Microsoft Accessでは、グリッドまたはフォームの移入に使用するときと同じ、レコード・フェッチのバッチを使用します。Microsoft Accessは、最初にデータのチャンク(100行)をフェッチして、その後定期的にサーバーから100行のセットを取得します。
この処理は、フェッチ済の行に一致しないエントリを指定した場合を除き、適切に動作します。このようなエントリを指定した場合、Microsoft Accessは、一致する行が検出されるか、またはすべてのレコードが取得されるまで、サーバーからレコードをフェッチします。大規模なセットが戻される場合、この手順には時間がかかる場合があります。また、ユーザー・インタフェースで問題が発生する場合もあります。
Microsoft Accessでは、ドロップダウン・リストの問合せは共有されません。スナップショットの問合せは、複数のリスト・ボックス間で再利用できません。かわりに、Microsoft Accessは、実行される各問合せを個別に処理します。
小さいドロップダウン・リスト(レコード数が100未満の場合など)では、多くの場合、Microsoft Accessの通常の操作で問題ありません。大きいリストでは、同期化されたシャドウ表をMicrosoft Accessに構築すると有効な場合があります。表の情報をMicrosoft Accessにローカルに格納し、ローカル表をOracleの情報と定期的に同期化します。