ODP.NETのデータアクセス・チューニング:ODP.NETファーストステップ(3)(1/4 ページ)
Windowsプラットフォームにおけるアプリケーション開発は、.NETが主流となりつつある。本連載はVisual Basicから.NETへの移行を考えているOracleアプリケーション開発者に向けて、「Oracle Data Provider for .NET」を使うメリットや独自機能、新しいプログラミング・スタイルなどを解説する。(編集局)
主な内容
--Page 1--
▼LOBデータの操作とチューニング
▼BLOBアクセスの基本操作
▼LOBデータ取得時のパフォーマンス・チューニング
--Page 2--
▼OracleDataReader使用時のパフォーマンス・チューニング
--Page 3--
--Page 4--
今回はOracle Data Provider for .NET(以下、ODP.NET)を利用してOracleデータベースへアクセスするための詳細な説明と、パフォーマンスを向上させるためのコーディング・テクニックについて説明します。
LOBデータの操作とチューニング
LOBとはラージオブジェクト(Large Object)のことで、ギガバイト級の大きなファイルサイズのデータを扱うオブジェクトです。LOBのデータ型は主にBLOB(Binary Large Object)とCLOB(Character Large Object)の2種類に分類されます。
BLOBアクセスの基本操作
まず、ODP.NETからBLOBへのアクセス方法を説明します。
手順1
テスト用のBLOBフィールドを含んだテーブルを作成します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
手順2
以下のサンプル用ビットマップ・イメージファイルをダウンロードして、Cドライブのtempディレクトリに保存してください。
手順3
BLOBフィールドへの値の代入は、以下のようなコードになります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
OracleParameterオブジェクトのOracleDbTypeプロパティをBlobに指定し、画像データなどのバイナリデータを格納します。
手順4
BLOBフィールドから値を取得し、PictureBoxに表示するコードは以下になります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
BLOB型で格納された情報を取得するには、OracleDataReaderオブジェクトのGetOracleBlobメソッドを使用し、結果をOracleBlobオブジェクトに格納します。
LOBデータ取得時のパフォーマンス・チューニング
LOBの列型を含むOracleDataReaderが作成されると、OracleDataReaderを作成したOracleCommandのInitialLOBFetchSizeプロパティの値がOracleDataReaderによってチェックされ、LOBの列データをすぐにフェッチする必要があるかどうかが判断されます。デフォルトでは、InitialLOBFetchSizeは「0」に設定されています。
OracleCommandのInitialLOBFetchSizeプロパティの値が「0」のままであれば、LOBデータ全体の取得は、アプリケーションによってデータが明示的に要求されるまで延期されます。InitialLOBFetchSizeプロパティが「0」以外の値に設定されていると、その値の文字数またはbyte数までLOBデータが即座にフェッチされます。
InitialLOBFetchSizeプロパティがデフォルトの「0」の場合、OracleDataReaderのGetOracleBlob/GetOracleClobメソッドを起動して、OracleBlob/OracleClobオブジェクトを取得できます。ただしInitialLOBFetchSizeが「0」以外の値に設定されていると、GetOracleBlob/GetOracleClobメソッドは無効です。その場合には、GetBytes/GetCharsメソッドをそれぞれ使用してBLOB/CLOBデータをフェッチする必要があります。InitialLOBFetchSizeを指定したコードは以下のようになります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
InitialLOBFetchSizeを「0」以外の値に設定すると、OracleBlob/OracleClobオブジェクトを使用してLOBデータを取得するよりも、高いパフォーマンスを得られることがあります。OracleDataReaderからOracleBlob/OracleClobオブジェクトを取得する必要のないアプリケーションで、LOB列データがそれほど大きくない場合がこれに該当します。InitialLOBFetchSizeは、問い合わせで返されるLOB列データのサイズがすべての行でほぼ同じ場合、特に便利です。
一般にInitialLOBFetchSizeは、問い合わせで返される行のうち、80%を超える行のLOBデータのサイズよりも大きな値に設定することをお勧めします。例えば、80%の行でLOBデータのサイズが1Kbytesよりも小さく、20%の行で1Mbytesよりも大きい場合には、InitialLOBFetchSizeを1Kbytesに設定します。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.