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関数またはODBC SQLSetStmtAttr関数の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関数SQLFreeStmtSQL_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では、主キーとして選択されたあらゆる列を使用して、このような問合せが実行されています。

関連項目:

データ型の実装