Oracleデータベースに10行の表を作成する次の文を考えてみます。
CREATE TABLE T1 (C1 number);
DBMS_STATS
パッケージを使用して表を分析します。次に例を示します。
DBMS_STATS.GATHER_TABLE_STATS ('SCOTT','T1'); DBMS_STATS.GENERATE_STATS ('SCOTT','T1');
前述の例では、スキーマ名をSCOTT
とし、表名をT1
としています。DBMS_STATS
パッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
Oracle以外のシステムに1000行を含む表を作成します。
次のSQL文を発行します。
SELECT a.* FROM remote_t1@remote_db a, T1 b WHERE a.C1 = b.C1;
Oracleオプティマイザは、エージェントに対して次のSQL文を発行します。
SELECT C1 FROM remote_t1@remote_db;
この文は、Oracle以外のシステムから1000行すべてをフェッチし、Oracleデータベース内で結合を実行します。
remote_t1
表のC1
列に一意の索引を追加して同じSQL文を再発行すると、エージェントはローカルt1
のC1
の値ごとに次のSQL文を受信します。
... SELECT C1 FROM remote_t1@remote_db WHERE C1 = ?; ...
注意:
?
はバインド・パラメータ・マーカーです。また、Oracleにより生成されたバインド変数を含む結合条件は、ネステッド・ループ結合方法についてのみ生成されます。
SQL実行計画を確認するには、SQL文のEXPLAIN PLANを生成します。最初に、admin
ディレクトリにutlxplan
をロードします。
次のように入力します。
EXPLAIN PLAN FOR SELECT a.* FROM remote_t1@remote_db a, T1 b WHERE a.C1 = b.C1;
次の文を入力してutlxpls
ユーティリティ・スクリプトを実行します。
@utlxpls
OPERATION REMOTE
は、リモートSQLが参照されていることを示します。
どの文が送信されるかを確認するには、次の文を入力します。
SELECT ID, OTHER FROM PLAN_TABLE WHERE OPERATION = 'REMOTE';