DRIVING_SITEヒントが効かない
■ご質問
2つのDBをDBLINKでつなげている環境にてSQLチューニングを実施しています。
そこで2つのDBのテーブルをUNIONALLしたViewに「DRIVING_SITE」ヒントを埋め込むことで、
そのViewを使用するSQLをリモートDB側で処理させるようにしたいのですが
上手くヒントが効かず(実行計画がローカルDB側のまま)困っています。
何か記述の仕方が間違っているでしょうか?
■環境
サーバーA:OracleDatabase11g AIX6.1
サーバーB:OracleDatabase11g AIX6.1
■詳細
問題のVIEWのDDL文は以下となっています。
VIEWの中でサーバーA側のテーブルとサーバーB側のテーブルをUNION_ALLでつないでいます。
【View1】
CREATE OR REPLACE VIEW
( … )
SELECT /*+ DRIVING_SITE(TABLE1) */
…
FROM
TABLE1@dblink1 --サーバーB側のテーブル
UNION ALL
SELECT …
FROM
TABLE1 --サーバーA側のテーブル
/
【View2】
CREATE OR REPLACE VIEW
( … )
SELECT /*+ DRIVING_SITE(TABLE2) */
…
FROM TABLE2@サーバーB --サーバーB側のテーブル
UNION ALL
SELECT …
FROM TABLE2 --サーバーA側のテーブル
/
サーバーA,Bともに同じテーブル名を使用しています。レイアウトも全く同じです。
※サーバーAには最近のデータ、サーバーBには過去データが格納されており
それをUNION_ALLでつなげてVIEWで見ようとしているためこのような作りになっています
そして、サーバーA側のDBにて以下のSQLを発行しています。
【発行SQL】
SELECT
T1.CODE1
, V2.CODE2
, SUM(V2.SALES) SALES
, V3.NAME1
FROM
( SELECT …
FROM VIEW1 V1
WHERE V1.START_DATE >= :B1
AND V1.END_DATE <= :B2
) T1
, VIEW2 V2
, OTHER_VIEW1 V3
WHERE
…
GROUP BY
V1.CODE1 , V2.CODE2 , V3.NAME1;
実行計画
-----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Inst |IN-OUT|
-----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 248 | 14 (8)| | |
| 1 | HASH GROUP BY | | 1 | 248 | 14 (8)| | |
|* 2 | FILTER | | | | | | |
| 3 | NESTED LOOPS | | 1 | 248 | 13 (0)| | |
| 4 | NESTED LOOPS | | 1 | 240 | 13 (0)| | |
| 5 | NESTED LOOPS | | 1 | 210 | 11 (0)| | |
| 6 | NESTED LOOPS | | 1 | 202 | 11 (0)| | |
| 7 | NESTED LOOPS | | 1 | 177 | 9 (0)| | |
| 8 | NESTED LOOPS | | 1 | 169 | 9 (0)| | |
| 9 | NESTED LOOPS | | 1 | 135 | 7 (0)| | |
| 10 | NESTED LOOPS | | 1 | 116 | 6 (0)| | |
| 11 | NESTED LOOPS | | 1 | 84 | 4 (0)| | |
| 12 | NESTED LOOPS | | 1 | 56 | 3 (0)| | |
| 13 | TABLE ACCESS BY INDEX ROWID| OTHER_TABLE1 | 1 | 28 | 2 (0)| | |
|* 14 | INDEX UNIQUE SCAN | OTHER_TABLE1_U2 | 1 | | 1 (0)| | |
| 15 | TABLE ACCESS BY INDEX ROWID| OTHER_TABLE1 | 1 | 28 | 1 (0)| | |
|* 16 | INDEX UNIQUE SCAN | OTHER_TABLE1_U2 | 1 | | 0 (0)| | |
| 17 | TABLE ACCESS BY INDEX ROWID | OTHER_TABLE1 | 1 | 28 | 1 (0)| | |
|* 18 | INDEX UNIQUE SCAN | OTHER_TABLE1_U2 | 1 | | 0 (0)| | |
| 19 | VIEW | TABLE2 | 1 | 32 | 2 (0)| | |
| 20 | UNION-ALL | | | | | | |
| 21 | REMOTE | TABLE2 | 6624 | 459K| 4806 (1)| dblink1| R->S |
|* 22 | TABLE ACCESS BY INDEX ROWID| TABLE2 | 17196 | 537K| 84291 (1)| | |
|* 23 | INDEX RANGE SCAN | TABLE2_N4 | 240K| | 1146 (1)| | |
| 24 | VIEW | TABLE1 | 1 | 19 | 1 (0)| | |
| 25 | UNION-ALL PARTITION | | | | | | |
| 26 | REMOTE | TABLE1 | 1 | 37 | 3 (0)| dblink1| R->S |
|* 27 | FILTER | | | | | | |
|* 28 | TABLE ACCESS BY INDEX ROWID| TABLE1 | 1 | 19 | 3 (0)| | |
|* 29 | INDEX UNIQUE SCAN | TABLE1_PK | 1 | | 2 (0)| | |
|* 30 | TABLE ACCESS BY INDEX ROWID | OTHER_TABLE2 | 1 | 34 | 2 (0)| | |
|* 31 | INDEX RANGE SCAN | OTHER_TABLE2_N1 | 1 | | 1 (0)| | |
|* 32 | INDEX UNIQUE SCAN | OTHER_TABLE2_TL_U1 | 1 | 8 | 0 (0)| | |
|* 33 | TABLE ACCESS BY INDEX ROWID | OTHER_TABLE2 | 1 | 25 | 2 (0)| | |
|* 34 | INDEX RANGE SCAN | OTHER_TABLE2_N1 | 1 | | 1 (0)| | |
|* 35 | INDEX UNIQUE SCAN | OTHER_TABLE2_TL_U1 | 1 | 8 | 0 (0)| | |
|* 36 | TABLE ACCESS BY INDEX ROWID | OTHER_TABLE2 | 1 | 30 | 2 (0)| | |
|* 37 | INDEX RANGE SCAN | OTHER_TABLE2_N1 | 1 | | 1 (0)| | |
|* 38 | INDEX UNIQUE SCAN | OTHER_TABLE2_TL_U1 | 1 | 8 | 0 (0)| | |
-----------------------------------------------------------------------------------------------------------------------
ちなみに同様の方法(ViewにDRIVING_SITEヒントを埋め込む)で
他のSQLはリモートDB側での処理に切り替わりました。
こいつだけ実行計画が変わらないんです。
何かお気づきの点があればコメント頂けると助かります。
よろしくお願いいたします。
Edited by: user12133202 on 2011/10/28 13:17