スマートLOB(サーバーからクライアント)の使用上の注意 - ODBC Driver for Teradata

ODBC Driver for Teradata® ユーザー ガイド

Product
ODBC Driver for Teradata
Release Number
17.20
Published
2022年6月
Language
日本語
Last Update
2022-08-22
dita:mapPath
ja-JP/uqj1639470627591.ditamap
dita:ditavalPath
ja-JP/nkw1500504256726.ditaval
dita:id
B035-2526
Product Category
Teradata Tools and Utilities

概要

過去のバージョンのTeradata ODBCドライバでは、LOB以外のデータは、データベースからドライバにインラインで取得されていました。各LOBデータ アイテムを取得するには、データベースへのラウンド トリップが必要であり、LOBデータ アイテムが比較的小さい場合に効率が低下していました。

TD ODBC Driver 16.10より、特定のサイズ制限が満たされている場合、データベースのLOBデータをインラインでドライバに取得できるようになりました。

必要に応じて、下表の用語および定義を参照してください。次の表に、SLOBデータおよびLOBデータの特性の詳細と、LOBデータをインラインで返すためのクライアントでのドライバの構成手順を示します。

用語 定義
CLOB 文字LOB(データ型)
BLOB バイナリLOB(データ型)
SLOB スマートLOB(転送メカニズム)
DLOB 遅延LOB(転送メカニズム)
応答メッセージ データベースからドライバに返される、複数のデータ アイテムを含むメッセージ。
応答メッセージの最大バイト数(MaxRespSize) クライアントで構成できる応答メッセージの最大サイズ。上限は16MBです。
単一LOBの最大バイト数(MaxSingleLOBBytes) クライアントで構成できるSLOB(CLOB、BLOB)アイテムの最大サイズ。デフォルトは0です。
行ごとの総LOBバイト数(MaxTotalLOBBytesPerRow) クライアントで構成できる、行ごとの全LOBの最大サイズ(バイト単位)。デフォルトは0です。
  • ドライバが追加のラウンド トリップを経由してLOBデータ アイテムを取得するメカニズムは、遅延LOB(DLOB)と呼ばれます。
  • データベースがインラインでLOBアイテムを返すメカニズムは、スマートLOB(SLOB)と呼ばれます。
  • クライアントは、LOBアイテムの実際の転送メカニズムを把握できないため、クライアントのパフォーマンスが上下する可能性があります。
  • MaxSingleLOBBytesまたはMaxTotalLOBBytesPerRowが0の場合、データベースはSLOBを送信せず、すべてのLOBがDLOBとして送信されます。
  • 現在、MaxSingleLOBBytesMaxTotalLOBBytesPerRowのデフォルト値は0であり、SLOBは送信されません。今後これらの値は、SLOBがデフォルト設定となるように応答メッセージの最大バイト数と同じ値に変更されます。

データ転送効率とSLOBおよびLOBの取得

データベースからドライバやクライアントへのデータ転送効率を最大化するには、SLOBが返される順序は列番号順になりますが、SLOBは複数の応答メッセージにまたがる可能性があることに注意してください。ドライバが保持できる応答メッセージは、常に2つまでです。例えば、ドライバがメッセージ2と3を処理する場合、元々メッセージ1に含まれていたSLOBは破棄されるため、利用できなくなります。

したがって、SLOBデータ アイテムには、iを増加させながら、SQLBindCol()またはSQLGetData(col i)を使用して順番にアクセスすることを推奨します。以下に例を示します。

SQLGetData(col 2) (SLOB is in response message 1)
SQLGetData(col 8) (SLOB is in response message 3)
SQLGetData(col 9) (SLOB is in response message 3)

LOBデータをランダムに取得する場合、データはSLOBデータからではなく、効率の低い遅延LOB(DLOB)メソッドでコピーされることがあります。以下に例を示します。

SQLGetData(col 8) (SLOB is in response message 3)
SQLGetData(col 9) (SLOB is in response message 3)
SQLGetData(col 2) (SLOB was in response message 1, already deleted)

上記の例で、列8および9のSLOBが同じ応答メッセージ内に含まれる場合、これらはSLOBからクライアントにコピーされます。列2のSLOBが過去の応答メッセージ内に含まれている場合、このメッセージは、列8および9へのアクセス後に削除される可能性があります。このため、列2のLOBは、過去に一度SLOBとして取得され破棄されていても、遅延LOB(DLOB)として取得されます。

LOBデータ アイテムは常に任意の順序で取得できるため、SLOBとDLOBのどちらでも取得されます。逐次アクセスによるSLOBの取得の方が、ランダム アクセスによるDLOBの取得よりも効率的です。

MaxSingleLOBBytesおよびMaxTotalLOBBytesPerRowの構成

MaxSingleLOBBytesMaxTotalLOBBytesPerRowの値は、以下の手順で説明する方法により任意の値に構成できます。

  1. Windowsの場合、Microsoft ODBCアドミニストレータを起動します。
  2. ユーザーDSNタブまたはシステムDSNタブで、目的のデータ ソースを選択します。
  3. 構成 > Options(オプション) > 詳細設定をクリックします。
  4. 次の図に示しているように、該当するフィールドにMaxResponseBufferSizeMaxSingleLOBBytesMaxTotalLOBBytesPerRowのうち望ましい値を入力します。
    DSN-DriverOptions.svg
  5. UNIXの場合、odbc.iniファイルを編集します。以下のように値を追加または変更します。
    [my_test_dsn]
    MaxRespSize           = 10000000
    MaxSingleLOBBytes     =  1000000
    MaxTotalLOBBytesPerRow= 10000000
  6. 接続文字列に追加します。
    MaxRespSize=10000000;MaxSingleLOBBytes=1000000;
    MaxTotalLOBBytesPerRow=10000000

    MaxSingleLOBBytesMaxTotalLOBBytesPerRowがともに0より大きい場合、データベースは次のメッセージを返します。

    ((現在のLOBのサイズ) < (MaxSingleLOBBytes)かつ((現在の全SLOBの累積サイズ) < (MaxTotalLOBBytesPerRow)))の場合、現在のLOBはSLOBとして送信されます。それ以外の場合、現在のLOBはDLOBとして送信されます。

クライアントは、どのLOB列をSLOBとして取得し、どの列をDLOBとしてオンデマンドで取得するかをある程度まで決定できます。ただし、データベースに、特定の列のLOBデータをSLOBとして送信するように指示するメカニズムはありません。このようなコントロールを実現する代用法として、クライアントが構成可能なパラメータであるMaxSingleLOBBytesがあります。

例えば、データベースに、1MB以下の写真サムネイルと、1MBより大きい高解像度写真の2つの列が含まれているとします。この場合に、サムネイルに青空が含まれる高解像度写真のみを処理することを考えます。パフォーマンスおよび効率を高めるため、クライアントは、サムネイルは常にSLOBとして取得し、必要な高解像度写真のみをDLOBとして取得するように、MaxSingleLOBBytesを1MBに設定します。

別の例として、クライアントは列1~3は常に1MB以下であることを認識しており、これらの列を常にSLOBとして送信するとします。また、列4~10はそれぞれ10MBであり、これらの列をSLOBとしては送信しないものとします。この場合、クライアントで、MaxSingleLOBBytesを以下のように設定します。
MaxRespSize            =  3100000
MaxSingleLOBBytes      =  1000000  // each SLOB
MaxTotalLOBBytesPerRow =  3000000  // sum of all SLOBs

MaxRespSizeは、行のLOB以外のデータ(integer、varchar、遅延LOBロケーター情報)すべてに加えて、すべてのSLOBデータを格納できるサイズである必要があります。

MaxRespSizeの値は、アプリケーションのデータ処理効率に合わせて調整できます。データ列どうしが互いに依存しておらず、並列処理が可能な場合、SLOBを複数の応答メッセージに分割して返信するように、すべてのSLOB列の合計サイズよりも小さい値にMaxRespSizeを設定してもかまいません。処理の開始前にアプリケーションですべての列のすべてのデータが必要になる場合は、SLOBは1つの応答メッセージで送信する必要があります。この場合、MaxRespSizeは、上限を16MBとしてすべてのSLOB列の合計サイズ以上に設定する必要があります。

MaxTotalLOBBytesPerRowMaxRespSize以下の場合、ドライバは常にすべてのSLOB列とLOB以外の列をキャッシュします。このため、データは逐次アクセス モードで取得することが推奨されていますが、アプリケーションはデータにランダムにアクセスできます。