2014년 1월 19일 일요일

[oracle hint]ACCESS경로변경힌트(INDEX_FFS)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

[oracle hint]ACCESS경로변경힌트(INDEX_FFS)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]



구로디지털 오엔제이프로그래밍실무교육센터
 
이 힌트의 의미는 인덱스를 FAST FULL SCAN하라는 것인데, 보통 인덱스에 대한 스캔은 단일 블록 스캔인데 반해 인덱스 패스트 풀 스캔은 Multi Block Scan 입니다 이왕 데이터를 읽을 때 하나씩 블록을 읽는 것보다 당연히 여러 개의 블록을 읽는다면 수행속도가 빨라질 것입니다.
 
물론 이 힌트가 동작하기 위해서는 SELECT절에 나타나는 컬럼 들이 INDEX_FFS의 인자로 사용된 인덱스의 컬럼 이어야 합니다. 예를 들어 index_ffs의 인자로idx_emp_ename(EMP 테이블의 ename 컬럼에 대한 인덱스) 이 주어졌다면 SELECT절에 나열되는 컬럼이 ename 이여야 한다는 것이죠...
 
[형식]
 
 
SELECT ename
FROM EMP
WHERE ENAME LIKE 'S%';
 
------------------------------------------------------------------
Operation        Object Name        Rows        Bytes        Cost        SELECT STATEMENT
------------------------------------------------------------------Optimizer Mode=ALL_ROWS                2                   2                                 
INDEX FAST FULL SCAN        SCOTT.IDX_EMP_ENAME        2          12          2          
 
[]                                          
SELECT COUNT(*)
FROM order_items l, orders o
WHERE l.order_id > 50
AND   l.order_id = o.order_id;
 
 
물론 위와 같은 경우 뿐 아니라 데이터의 개수를 헤아리는 COUNT(*)를 사용할 때도 INDEX_FFS를 사용하면 많은 시간을 단축할 수 있으니 이 부분은 Oracle Tip에 있는 COUNT(*)를 빠르게… 부분을 참고 하세요
 
 
[실습]
 
-      실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
 
myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5
 
테스트환경 : oracle 11g
 
 
아래 예제에서 실제 myemp1 ename으로 인덱스를 걸어서 count(ename)을 해보도록 하겠다.
 
SQL> create index idx_myemp1_ename on myemp1(ename);
 
인덱스가 생성되었습니다.
 
n  인덱스를 사용 못하도록 숨기자.
SQL> alter index idx_myemp1_ename invisible;
 
인덱스가 변경되었습니다.
 
n  인덱스를 사용하지 않고 ename count를 하니 8초가 넘게 걸린다.
SQL> select count(ename) from myemp1;
 
COUNT(ENAME)
------------
    10000000
 
   : 00:00:08.79
 
-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |    13 | 16931   (1)| 00:03:24 |
|   1 |  SORT AGGREGATE    |        |     1 |    13 |            |          |
|   2 |   TABLE ACCESS FULL| MYEMP1 |    10M|   123M| 16931   (1)| 00:03:24 |
-----------------------------------------------------------------------------
 
n  옵티마이저가 인덱스를 사용하도록 변경
SQL> alter index idx_myemp1_ename visible;
 
인덱스가 변경되었습니다.
 
n  인덱스를 보이도록 하니 CBO로 동작하여 오라클이 인덱스 패스트 스캔을 한다.
SQL> select count(ename) from myemp1;
 
COUNT(ENAME)
------------
    10000000
 
   : 00:00:04.85
 
------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |     1 |    13 |  9478   (1)| 00:01:54 |
|   1 |  SORT AGGREGATE       |                  |     1 |    13 |            |          |
|   2 |   INDEX FAST FULL SCAN| IDX_MYEMP1_ENAME |    10M|   123M|  9478   (1)| 00:01:54 |
------------------------------------------------------------------------------------------
 
n  이번에는 index_ffs 힌트 구문을 사용해 보자.
SQL> select count(ename) from myemp1;
 
COUNT(ENAME)
------------
    10000000
 
   : 00:00:04.87
 
------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |     1 |    13 |  9478   (1)| 00:01:54 |
|   1 |  SORT AGGREGATE       |                  |     1 |    13 |            |          |
|   2 |   INDEX FAST FULL SCAN| IDX_MYEMP1_ENAME |    10M|   123M|  9478   (1)| 00:01:54 |
------------------------------------------------------------------------------------------
 
 
 


 



  • 자바
  • 오라클/빅데이터
  • 아이폰/안드로이드
  • 닷넷/WPF
  • 표준웹/HTML5
  • 채용/취업무료교육
  • 초보자코스

  • 댓글 없음:

    댓글 쓰기