この章では、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の情報と定期的に同期化します。