(8.0.26)
テーブル最小要素="グループ化されていないテーブル又はグループ化されている場合はグループ化後のビュー"
-- 結合ヒント
NO_BNLヒントで確認
グループ化されていないインラインビューの場合、
本体側にインラインビュー内のテーブル名を問合せブロック名とともに指定する
その他、
インラインビューの内部や
グループ化されているサブクエリの内部にも指定可能
-- leadingヒント
テーブル最小要素を指定する
QB_NAMEブロック名は使用する必要なし
-- アクセスヒント
インラインビュー内やサブクエリ内の
テーブル名を本体、インラインビュー、サブクエリに指定可能
(19c)
https://blogs.oracle.com/otnjp/post/tsushima-hakushi-55
テーブル最小要素="グループ化されていないテーブル又はグループ化されている場合はグループ化後のビュー"
-- 結合ヒント
インラインビューの場合、
テーブル最小要素をシステム生成クエリブロック名を使用して本体側に指定する
インラインビューがグループ化されたビューの場合はインラインビュー名をそのまま使用できる(システム生成クエリブロック名を付与してもよい)
※ANSI結合構文の場合、ユーザ指定のクエリブロック名は使用できない
サブクエリの場合、
サブクエリが単純な1テーブルの場合、クエリブロック名を使用して本体側に指定する。
サブクエリが上記以外の場合、本体とサブクエリ間の結合はクエリブロック名を使用して本体側に指定し、
サブクエリ内の結合はサブクエリ内に指定する。
-- leadingヒント
インラインビューの場合、
テーブル最小要素を本体側に指定する。
システム生成クエリブロック名を使用する必要なし
サブクエリの場合、
サブクエリが単純な1テーブルの場合、そのテーブル名をクエリブロック名を使用して本体側に指定する。
サブクエリが上記以外の場合、本体とサブクエリ間の順序はクエリブロック名★を使用して本体側に指定し、
サブクエリ内の順序はサブクエリ内に指定する。
★ただし、"VW_SQ_1@SEL$38AD4B0C"のようなビューが生成されている場合は、こちらを使用する必要がある
-- アクセスヒント
インラインビューの場合、
基本的に、インラインビュー内に指定する。
(システム生成クエリブロック名を用いて本体側に指定も可能)
サブクエリの場合、
基本的にサブクエリ内に指定する。
(システム生成クエリブロック名かユーザ指定クエリブロック名を用いて本体側に指定も可能)
-- ヒント句例
explain plan for
select /*+ LEADING(t1 t2 t31 t32) USE_MERGE(T2@SEL$1 T31@SEL$5 T32@SEL$5) INDEX_FFS(t1) */ count(*) from tab1 t1
inner join
(
select /*+ LEADING(t22 t21) USE_MERGE(t21) FULL(t22) FULL(t21) */ t21.col1 from tab2 t21 inner join tab3 t22
on t21.col1 = t22.col1
where t21.col2 < 5000
group by t21.col1
having count(t22.col2) > 100
) t2
on t1.col1 = t2.col1
inner join
(
select /*+ FULL(t31) FULL(t32) */ t31.col1 from tab2 t31 inner join tab3 t32
on t31.col1 = t32.col1
) t3
on t1.col1 = t3.col1
;
explain plan for
select /*+ LEADING( t1 t2@qb1 t3@qb2 ) USE_MERGE( t2@qb1 t3@qb2 ) FULL(t1) */ count(*) from tab1 t1
where exists ( select /*+ QB_NAME(qb1) FULL(t2) */ 1 from tab2 t2 where t1.col1 = t2.col1 )
and exists ( select /*+ QB_NAME(qb2) FULL(t3) */ 1 from tab3 t3 where t1.col1 = t3.col1)
;
explain plan for
select /*+ LEADING(t1 t2@qb1 ) USE_MERGE(t2@qb1) FULL(t1) */ count(*) from tab1 t1
where exists ( select /*+ QB_NAME(qb1) */ 1 from
(
select /*+ LEADING(t22 t21) USE_MERGE(t21) FULL(t21) FULL(t22) */ t21.col2 from tab2 t21 inner join tab3 t22
on t21.col1 = t22.col1
where t21.col2 < 5000
group by t21.col2
having count(t22.col2) > 100
) t2 where t1.col2 = t2.col2 )
;
explain plan for
select /*+ LEADING( VW_SQ_1@SEL$38AD4B0C t1) USE_MERGE(t1) FULL(t1) */ count(*) from tab1 t1
where exists ( select /*+ LEADING(t3 t2) USE_MERGE(t2) FULL(t2) FULL(t3) */ 1
from tab2 t2 inner join tab3 t3
on t2.col1 = t3.col1
where t1.col1 = t2.col1 )
;
explain plan for
select /*+ LEADING( VW_SQ_1@SEL$3341FC40 t1) USE_MERGE(t1) FULL(t1) */ count(*) from tab1 t1
where exists ( select 1 from
(
select /*+ LEADING(t31 t32) USE_MERGE(t32) FULL(t31) FULL(t32) */ t31.col2 from tab2 t31 inner join tab3 t32
on t31.col1 = t32.col1
) t3 where t1.col2 = t3.col2 )
;
explain plan for
select /*+ LEADING( t1 t4@qb3 VW_SQ_1@SEL$509F7CF6 T2@qb1 ) USE_MERGE( t4@qb3 VW_SQ_1@SEL$509F7CF6 T2@qb1 ) FULL(t1) */
count(*) from tab1 t1
where exists ( select /*+ QB_NAME(qb1) */ 1 from
(
select /*+ LEADING(t22 t21) USE_MERGE(t21) FULL(t21) FULL(t22) */ t21.col1 from tab2 t21 inner join tab3 t22
on t21.col1 = t22.col1
where t21.col2 < 5000
group by t21.col1
having count(t21.col2) > 100
) t2 where t1.col1 = t2.col1 )
and exists ( select /*+ QB_NAME(qb3) FULL(t4) */ 1 from tab4 t4 where t1.col1 = t4.col1)
and exists ( select /*+ LEADING(t6 t5) USE_MERGE(t5) FULL(t5) FULL(t6) */ 1 from
tab5 t5 inner join tab6 t6 on t5.col1 = t6.col1 where t1.col1 = t5.col1 )
;
(14)
テーブル最小要素="グループ化されていないテーブル又はグループ化されている場合はグループ化後のビュー"
-- 結合ヒント
インラインビューの場合、
テーブル最小要素を指定する
サブクエリの場合、
ほぼ未対応
-- leadingヒント
テーブル最小要素を指定する
-- アクセスヒント
インラインビュー内やサブクエリ内の
テーブル名を指定可能
(2019)
-- leadingヒント
サブクエリやインラインビューについてもFORCE ORDERは有効