この章では、TimesTenデータベース上で最適に実行されるようにODBCアプリケーションをチューニングする方法について説明します。チューニングの一般的な詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のTimesTen Databaseのパフォーマンス・チューニングに関する項を参照してください。
この章の内容は次のとおりです。
TimesTen以外のデータベース・システムへのODBCアクセスを必要としないアプリケーションでは、ドライバ・マネージャを省略する必要があります。これは、アプリケーションをTimesTenの直接ドライバまたはクライアント・ドライバに直接リンクすることによって行います(「リンク・オプション」を参照)。パフォーマンスが大幅に向上します。
アプリケーションで、バッチと呼ばれる文の実行のグループを使用して、パフォーマンスを向上できます。
SQLParamOptions ODBC関数では、アプリケーションによってSQLBindParameterで割り当てられるパラメータのセットに複数の値を指定できます。これは、同じSQL文を様々なパラメータ値を使用して複数回処理する場合に有効です。たとえば、アプリケーションで、INSERT文に関連付けられているパラメータのセットに複数の値のセットを指定すると、INSERT文を1回実行してその挿入処理をすべて実行できます。
TimesTenでは、SQLParamOptionsをINSERT、UPDATE、DELETEおよびMERGE文とともに使用できますが、SELECT文とともに使用することはできません。
TimesTenリリース18.1では、次のバッチ・サイズをお薦めします。
TimesTen Classicの場合:
INSERT文に256
UPDATE文に32
DELETE文に32
MERGE文に32
TimesTen Scaleoutの場合:
INSERT文の場合は1024 x (グリッド内の要素数)
UPDATE文の場合は32 x (グリッド内の要素数)
DELETE文の場合は32 x (グリッド内の要素数)
(TimesTen ScaleoutはMERGE文をサポートしていません。)
表7-1に、SQLParamOptions引数の概要を示します。詳細は、ODBC APIのリファレンス・マニュアルを参照してください。
crow値が1より大きく、SQLBindParameterのrgbValue引数がパラメータ値の配列を指し、pcbValue引数が長さの配列を指すことを想定しています。(「SQLBindParameter関数」も参照してください。)
バッチ処理の完全な動作例は、TimesTen Classicクイック・スタートで、ソース・ファイルbulkinsert.cを参照してください。(TTClassesを使用したC++でのプログラミングについては、bulktest.cppも参照してください。)「TimesTenクイック・スタートおよびサンプル・アプリケーション」を参照してください。
|
ノート: SQLParamOptionsをTimesTen Client/Serverドライバとともに使用する場合、実行時データ・パラメータはサポートされません。(アプリケーションは、SQLBindParameter rgbValueバッファで、またはSQLPutDataに対する1つ以上のコールとともにパラメータの値を渡すことができます。SQLPutDataとともにデータが渡されるパラメータは、実行時データ・パラメータといいます。これらは一般に、SQL_LONGVARBINARYおよびSQL_LONGVARCHARパラメータのデータを送信するために使用され、その他のパラメータと混在することができます。) |
SQLBindColまたはSQLBindParameterは、型変換およびプログラム・バッファをデータ列またはパラメータと関連付けるためにコールします。特定のSQL文で、文を繰り返し実行する間に特定のデータ列またはパラメータに対する型変換またはメモリー・バッファが変更されない場合は、SQLBindColまたはSQLBindParameterを繰り返しコールしないことをお薦めします。1回準備し、1回バインドして、何回も実行します。
SQLGetDataを使用すると、列をバインドせずにデータをフェッチできます。この場合、アプリケーションでフェッチ対象のすべての行のすべての列に対してSQLGetData ODBCコールを発行する必要があるため、パフォーマンスに悪影響を及ぼす可能性があります。一方、バインドされた列を使用する場合は、フェッチされる列ごとに1回のみのODBCコールが必要となります。また、TimesTen ODBCドライバには、バインドされた列でデータをフェッチする方法が適しています。
ただし、SQLGetDataは、長い文字列またはバイナリ列からデータをピース単位でフェッチする場合に非常に有効です。(「ODBCでのLOBのピース単位のデータ・インタフェースの使用」のLOBに関する説明を参照してください。)
TimesTenの命令パスは非常に短いため、データ変換による短時間の遅れでさえ、トランザクション時間の大幅な増加の原因となる可能性があります。データ型の変換を回避するには、次の手順を実行します。
入力引数の型と式の型を一致させます。
出力バッファの型とフェッチされた値の型を一致させます。
接続文字セットとデータベース文字セットを一致させます。
TimesTenには、アプリケーションで複数行のデータをフェッチするために、TT_PREFETCH_COUNT ODBC文オプションが用意されています。この機能は、コミット読取り分離レベルを使用しているアプリケーションで使用できます。大量のTimesTenデータを取得するアプリケーションの場合、複数行のフェッチによってパフォーマンスを大幅に向上させることができます。ただし、アプリケーションですべてのデータが取得されるまで、取得されるすべての行にロックが設定されるため、同時実行性は低下します。TT_PREFETCH_COUNTの使用方法の詳細は、「複数のデータ行のプリフェッチ」を参照してください。
TimesTenには、問合せのパフォーマンスを最適化するために、TT_PREFETCH_CLOSE ODBC接続オプションが用意されています。この属性の使用方法の詳細は、「問合せのパフォーマンスの最適化」を参照してください。