概要
Oracleデータソースを利用するビューに対し、クライアントから大量の引数を持つIN句を含むクエリが実行された時に、IN句がOracle側にプッシュダウンされない場合があります。
この記事ではOracleデータソースにプッシュダウンさせるIN句引数上限値の設定手順について説明します。
大量の引数を持つIN句がプッシュダウンされない原因
大量の引数を持つIN句を含むクエリの例としては以下のようなものがあります。
SELECT * FROM [仮想テーブル名] WHERE (COL1, COL2) IN ( ('xxx', 'abcdefg'), ('yyy', 'hijklmn'), ... ('zzz', 'opqrstu') )
このようなクエリのIN句がデータソースにプッシュダウンされない原因の一つとして考えられるのは、IN句の引数の個数がTDV Server の設定値 jdbcds.max_number_of_in_operator_values
を超過していることです。
本記事では、 jdbcds.max_number_of_in_operator_values
の変更方法について説明します。
OracleのXMLファイルを修正
TDV Serverが利用するOracleのXMLファイルにファイルに設定値 jdbcds.max_number_of_in_operator_values
を追記する必要があります。
※ Oracleのcapabilitiesファイルのを設定値 jdbcds.max_number_of_in_operator_values
を更新することも可能ですが、更新した内容はアップグレードやCARファイルでの移行時に引き継がれないため、XMLファイルでの設定を推奨します。
XMLファイルは、
[TDV Serverインストール先フォルダパス]\app\dlm\apps\[アダプタ名]\conf
を指します。
Oracle 19c (Thim Driver)の場合は以下のパスに存在します。
[TDV Serverインストール先フォルダパス]\conf\adapters\system\oracle_19c_thin_driver\oracle_19c_thin_driver_values.xml
修正対象のOracleのXMLファイルが特定できましたら、それをテキストエディタ等で開き、ファイル先頭から4行目あたり、Please insert customized elements after this line.
のコメント下に以下の内容を追記します。
<ns37:attribute xmlns:ns37="http://www.compositesw.com/services/system/util/common">
<ns37:name>/runtime/query/MaxNumberOfInOperatorValues</ns37:name>
<ns37:type>INTEGER</ns37:type>
<ns37:value>3000</ns37:value>
<ns37:configID>jdbcds.max_number_of_in_operator_values</ns37:configID>
</ns37:attribute>
ns
の後に続く番号、およびnameはXMLファイルの中にある他のattributeとは異なる一意の値にしてください。
value
は TDV Server が受け付けるクエリの内容を考慮し決定してください。
OracleのXMLファイルの変更が完了しましたら、変更を反映するために、TDV Serverサービスを再起動します。
TDV Serverが正常に再起動されましたら、クエリを再度実行頂き、IN句がOracleにプッシュダウンされているかどうかを確認します。
ただし、 jdbcds.max_number_of_in_operator_values
の上限を引き上げた結果、大量のIN句がOracle側にプッシュダウンされ、それによりOracle側の制約に抵触する可能性もありますので、変更後の jdbcds.max_number_of_in_operator_values
の値についてはOracle側の設定も考慮しつつ決定頂く必要があります。