ttOptSetOrder

このプロシージャは、オプティマイザが表を結合する順序を指定します。文字列は、カンマではなく空白で区切られた表名または表の相関名のリストで、問合せまたは副問合せで参照されます。最初にリストされている表が、計画によって最初にスキャンされます。たとえば、ネステッド・ループ結合では一番外側になります。相関名は、修飾された表名のショートカットまたは別名です。この組込みプロシージャの実行中は、AutoCommitOFFに設定する必要があります。

必要な権限

このプロシージャには、権限は必要ありません。

TimesTen ScaleoutおよびTimesTen Classicでの使用

このプロシージャは、TimesTen Classicでサポートされています。

TimesTen Scaleoutアプリケーションでこの組込みプロシージャをコールできます。

TimesTen Scaleoutの場合、このプロシージャは、コール元の要素に対してローカルに実行されます。

関連ビュー

このプロシージャには関連ビューはありません。

構文

ttOptSetOrder('joinOrder')

パラメータ

ttOptSetOrderには、次の必須のパラメータがあります。

パラメータ 説明

joinOrder

TT_VARCHAR(1024)

空白で区切られた表名または表相関名のリスト。表名を区別するために所有者が必要な場合は、表相関名を使用します。joinOrderを指定しない場合、問合せオプティマイザの動作はデフォルトに戻ります。

結果セット

ttOptSetOrderは結果を返しません。

CALL ttOptSetOrder ('EMPS DEPTS ACCTS');

アプリケーションが次のコールを実行するとします。

CALL ttOptSetOrder('ORDERS CUSTOMERS');

オプティマイザは、1つ以上の未出荷注文を持つすべての顧客を表示する次の問合せを評価する際に、CUSTOMERSをスキャンする前に、ORDERS表をスキャンします。

SELECT CUSTOMERS.NAME
FROM CUSTOMERS
WHERE EXISTS (SELECT 1
        FROM  ORDERS
        WHERE CUSTOMERS.ID = ORDERS.CUSTID
        AND  ORDER.STATUS ='UN-SHIPPED');

アプリケーションが次のコールを実行するとします。

ttOptSetOrder('DEPTS EMPS ACCTS');

オプティマイザは、特定のアカウントで働いている従業員の数を評価する際に、DEPTSACCTSの間で結合を実行することはできません。

SELECT COUNT(DISTINCT EMPS.ID)
FROM  ACCTS, DEPTS, EMPS
WHERE ACCTS.DEPTS = DEPTS.ID
AND  EMPS.DEPTS = DEPTS.ID
AND  ACCTS.NUM = :AcctNum

アプリケーションで、結合順序をリセットせずに、3つの各表を参照しないコマンドを準備しようとすると、オプティマイザによって警告番号965が発行されます。指定した結合順序は適用されません。TimesTenでは、コマンドが準備される際、有効な結合順序が考慮され、指定した結合順序は無視されます。

ノート

  • 結合順序では、導出された表の別名はサポートされていません。表の別名を指定すると、TimesTenによって、その順序は適用できないことを示す警告メッセージ965が返されます。

  • 文字列の長さは1,024バイトに制限されています。文字列がこの長さを超えると、切り捨てられ、警告が発行されます。

  • 副問合せで参照される相関名が結合順序に含まれていると、TimesTenでは、内部的に分離モードに切り替えられます。

  • コマンドが準備されている場合は、現在のオプティマイザ・フラグ、索引ヒントおよび結合順序はコマンドのコンパイル済形式の構造で保持され、システムによってそのコマンドが再準備されるときに使用されます。再準備された文の例については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』「TimesTen問合せオプティマイザ」を参照してください。

  • このコールによって加えられた変更はただちに有効になり、現在のトランザクションでのODBC関数SQLPrepareまたはJDBCメソッドConnection.prepareCallへの後続のすべてのコールに影響します。後続のトランザクションに備えて、問合せオプティマイザの動作はデフォルトに戻ります。

  • 結合順序を使用する場合、問合せによって参照される表の名前は、指定した名前と厳密に一致している必要があります(比較では大文字と小文字が区別されません)。部分的な順序を指定するメカニズムはないため、完全な順序を指定する必要があります。問合せに副問合せがある場合、結合順序は副問合せの中の相関名も参照する必要があります。つまり、結合順序は問合せの中のすべての相関名を参照する必要があります。TimesTenオプティマイザは、GROUP BYを使用して、特別な種類の結合問合せとして副問合せを内部的に実装します。結合順序を適用可能にするには、すべての相関名を参照する必要があります。矛盾がある場合はTimesでは警告が発行され、指定した結合順序は完全に無視されます。

  • 結合の順序は、特定のSQL文の中で文レベル・オプティマイザ・ヒントを使用して設定することもできます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』「文レベルのオプティマイザ・ヒント」を参照してください。特にヒントの各スタイルの動作については、オプティマイザ・ヒントの項を参照してください。