Optimizing Oracle Optimizer (2011년)
FIRST_ROWS(K) 0 0 2,549

by 구루비스터디 FIRST_ROWS [2018.07.14]


Oracle Manual
  • FIRST_ROW 힌트는 일종의 Rule Base이며, First_Row(K) 힌트는 100% cost base이다


  • Oracle 10g R1까지는 First_Row(K) 힌트는 100% cost base였다
  • Oracle 10g R2부터는 Rule Base logic이 추가되었다.
  • Cost가 높더라도 Index를 선호하는 방식으로 동작한다.
  • First_Row 힌트는 항상 Rule Base로 동작하며, oracle9i는 Deprecated되었다.



create table t1(c1 int, c2 int);

create index t1_n1 on t1(c1);

insert into t1
select MOD(level,100)+1 C1, level c2 from DUAL
CONNECT BY LEVEL <= 10000;

=> FULL Hint를 사용해서 Table Full Scan을 유도
select /*+ full(t1) */ *
  from t1
 where c1 = 1;

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   100 |  2600 |     7   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |   100 |  2600 |     7   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("C1"=1)
   
=> INDEX Hint를 사용해서 Index Range Scan을 유도
select /*+ index(t1) */ *
  from t1
 where c1 = 1;


-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time    |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |   100 |  2600 |     9   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1    |   100 |  2600 |     9   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T1_N1 |   100 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("C1"=1)
    
=> First_Rows Hint를 사용
select /*+ First_Rows */ *
  from t1
 where c1 = 1;
 
-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time    |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |   100 |  2600 |     9   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1    |   100 |  2600 |     9   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T1_N1 |   100 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("C1"=1)


=> First_Rows(10) Hint를 사용
select /*+ First_Rows(10) */ *
  from t1
 where c1 = 1;

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time    |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |   100 |  2600 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1    |   100 |  2600 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T1_N1 |       |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("C1"=1)




(참고)아무 힌트를 주지 않았을 경우
select  *
  from t1
 where c1 = 1;

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   100 |  2600 |     7   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |   100 |  2600 |     7   (0)| 00:00:01 |
--------------------------------------------------------------------------


=> 테스트환경은 10g R2 이며 R1에서는 테스트하지 못함.


"데이터베이스 스터디모임" 에서 2009년에 "OPTIMIZING ORACLE OPTIMIZER " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3969

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입