8 パフォーマンスとチューニング
この章では、プログラマがOracle Database ODBCドライバのパフォーマンスおよびチューニングを管理するために必要な情報を提供します。
トピック:
8.1 一般的なODBCプログラミングのヒント
この項では、ODBCアプリケーションのパフォーマンスを向上させるためのいくつかの一般的なプログラミングのヒントを記述しています。
-
アプリケーションがデータソースに対する接続および切断を頻繁に繰り返す場合は、接続のプーリングを有効にします。プールされた接続の再利用は、接続の再確立に比べて非常に効率的です。
-
文を準備する回数を最小限にします。可能な場合は、バインド・パラメータを使用し、別のパラメータ値に対して文を再利用できるようにします。1つの文を1回準備して複数回実行するほうが、
SQLExecute
ごとに文を準備するよりもはるかに効率的です。 -
アプリケーションで取得しないとわかっている列を
SELECT
文に含めないでください(特にLONG
列)。データベース・サーバー・プロトコルの性質上、アプリケーションが列をバインドするか、SQLGetData
をバインドするかに関係なく、SELECT
文にLONG
列が含まれている場合、ODBCドライバはLONG列全体の内容をフェッチする必要があります。 -
データソースを更新しないトランザクションを実行中の場合は、ODBC
SQLSetConnectAttr
関数のSQL_ATTR_ACCESS_MODE
属性をSQL_MODE_READ_ONLY
に設定します。 -
ODBCのエスケープ句を使用していない場合は、ODBC
SQLSetConnectAttr
関数またはODBCSQLSetStmtAttr
関数のSQL_ATTR_NOSCAN
属性をTRUEに設定します。 -
行数の多い表からデータを取得する場合は、ODBCの
SQLFetch
関数のかわりにODBCのSQLFetchScroll
関数を使用します。 -
同じSQL文が複数回使用される場合には、OCI文キャッシュを有効にします(
StatementCache=T
)。 -
NUMBER
列をFLOAT
としてバインドすると問合せの実行が高速になります(BindAsFLOAT=T
)。 -
LONG
またはLONG RAW
のフェッチ中に、MaxLargeData=<value>
に設定するとパフォーマンスが最適化されます。 -
Ref Cursor
を戻す小さいパッケージ・プロシージャに対して大量のコールが行われるアプリケーションでUseOCIDescribeAny=T
と設定すると、パフォーマンスが向上します。
親トピック: パフォーマンスとチューニング
8.2 データソース構成オプション
このトピックでは、次のODBCデータソース構成オプションのパフォーマンスに関連する事項を説明します。
トピック:
結果セットを有効化
このオプションによって、プロシージャ・コールから結果セット(RefCursor
など)を返すサポートが有効になります。デフォルトでは、結果セットを返すサポートが有効です。
ODBCドライバは、RefCursor
パラメータがあるかどうかを判断するために、データベース・サーバーに問合せを実行して、プロシージャのパラメータ・セットおよびそれらのデータ型を判別する必要があります。この問合せによって、最初にプロシージャが準備完了になり実行されると、追加のネットワーク・ラウンド・トリップが発生します。
LOBを有効化
このオプションによって、LOBを挿入および更新するサポートが有効になります。このオプションはデフォルトでは有効になっています。
ODBCドライバは、LOBパラメータがあるかどうかを判断するために、データベース・サーバーに問合せを実行して、INSERT
文またはUPDATE
文の各パラメータのデータ型を判別する必要があります。INSERT
またはUPDATE
文が最初に処理および実行される際、この問合せが追加のネットワーク・ラウンド・トリップを発生させます。
TIMESTAMPをDATEとしてバインド
SQL_TIMESTAMP
パラメータを適切なOracleデータ型でバインドします。このオプションがTRUE
である場合、SQL_TIMESTAMP
はOracleのDATE
データ型でバインドされます。このオプションがFALSE
である場合、SQL_TIMESTAMP
はOracleのTIMESTAMP
データ型でバインドされます(デフォルト)。
カーソル・クローズを有効化
ODBC関数SQLFreeStmt
のSQL_CLOSE
オプションは、関連するカーソルを文とともにクローズし、保留中のすべての結果を廃棄します。アプリケーションは、SQLPrepare
なしで文を再実行しカーソルを再開させることができます。このオプションを使用する典型的な例は、しばらくの間アイドル状態になり、後で同じSQL文を再利用するアプリケーションの場合です。この場合、アプリケーションがアイドル状態になっている間、関連するサーバー・リソースを解放することがあります。
Oracle Database ODBCドライバが階層化されているOracle Call Interface (OCI)は、カーソル・クローズ機能をサポートしていません。デフォルトでは、SQL_CLOSE
オプションはOracle Database ODBCドライバには影響がありません。カーソルおよび関連のリソースは、データベース・サーバー上にオープンされた状態で存在します。
このオプションを有効にすると、データベース・サーバー上の関連するカーソルがクローズします。ただし、その結果、SQL文の解析コンテキストが失われます。ODBCアプリケーションは、SQLPrepare
コールなしで再び文を実行することができます。ただし、実際にはODBCドライバは文をすべて準備してから実行する必要があります。このオプションを有効にした場合、一度文を解析し、それを繰り返して実行するアプリケーションのパフォーマンスには重大な影響があります。
サーバーの関連リソースを解放することが確実に必要である場合のみ、このオプションを有効にします。
スレッド・セーフティを有効化
アプリケーションがシングル・スレッドの場合、このオプションを無効にできます。デフォルトでは、ODBCドライバは、すべての内部構造(環境、接続、文)へのアクセスがスレッド・セーフティであることを確認します。シングル・スレッドのアプリケーションは、このオプションを無効にすることにより、スレッド・セーフティのオーバーヘッドの一部を回避できます。このオプションを無効にすることにより、通常は多少のパフォーマンスの改善がみられます。
フェッチ・バッファ・サイズ
「Oracle ODBCドライバ構成」ダイアログ・ボックスの「Oracle」オプション・タブの「フェッチ・バッファ・サイズ」をバイト単位で設定します。この値は、単一の問合せでアプリケーション・プログラムがリクエストする行数に関係なく、ODBCドライバがOracle Databaseからクライアントのキャッシュに一度にプリフェッチしてパフォーマンスを向上させるデータの行数を決定します。
通常一度に20行未満をフェッチするアプリケーションでは、特に低速なネットワーク接続の場合や非常に負荷の高いサーバーでのレスポンス時間が向上します。これを大きく設定しすぎると、レスポンス時間が悪化したり、メモリーを大量に消費することがあります。デフォルトは64,000バイトです。アプリケーションに最適な値を選択します。
ノート:
LONG
およびLOBデータ型がある場合、ODBCドライバのプリフェッチ行数は、フェッチ・バッファ・サイズに依存しません。LONG
およびLOBデータ型では、パフォーマンスの改善が見込めず、過度のメモリー消費を引き起こす可能性があります。ODBCドライバは、LONG
およびLOBデータ型がある場合、フェッチ・バッファ・サイズを無視し、設定された行数をプリフェッチします。
親トピック: パフォーマンスとチューニング
8.3 DATEデータ型およびTIMESTAMPデータ型
索引を含むDATE
列をWHERE
句で使用すると、データベースのパフォーマンスに影響する場合があります。次に例を示します。
SELECT * FROM EMP WHERE HIREDATE = ?
この例ではHIREDATE
列の索引を使用して、瞬時に問合せを実行できます。ただし、HIREDATE
は実際にはDATE
値であり、ODBCドライバによりTIMESTAMP
のパラメータ値が提供されるため、Oracleサーバーの問合せオプティマイザには変換機能を適用する必要があります。誤った結果(パラメータ値にゼロ以外の小数秒が含まれる場合に発生する可能性があります)を回避するには、次のような文になるようにオプティマイザでHIREDATE
列に変換を適用します。
SELECT * FROM EMP WHERE TO_TIMESTAMP(HIREDATE) = ?
残念ながら、これにより、HIREDATE
列の索引の使用は無効になり、かわりにサーバーによる表のスキャンが順次実行されます。表に多くの列が含まれる場合、これには時間がかかります。この状況を回避するため、ODBCドライバには「TIMESTAMPをDATEとしてバインド」
接続オプションが用意されています。このオプションを有効にすると、ODBCドライバにより、SQL_TIMESTAMP
パラメータはOracleのTIMESTAMP
データ型ではなくOracleのDATE
データ型としてバインドされます。これにより、問合せオプティマイザでDATE
列の索引が使用できるようになります。
ノート:
このオプションは、DATE
列をTIMESTAMP
列としてバインドするMicrosoft Accessや類似のプログラムで使用することを目的としています。実際のTIMESTAMP
列がある場合、またはデータが失われる可能性がある場合は、このオプションを使用しないでください。Microsoft Accessでは、主キーとして選択されたあらゆる列を使用して、このような問合せが実行されています。
関連項目:
親トピック: パフォーマンスとチューニング