インラインビューやサブクエリを含むSQLのヒント句指定方法

(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は有効