COUNT(*)를 빠르게 하기
개발을 하다보면 흔히 어떤 테이블에 원하는 데이터가 있는지 세어보는 경우가 가끔 있습니다.
이러한 경우 COUNT(*)를 사용하는데 좀더 빠르게 할 수 있는 방법이 있습니다.
COUNT를 할 때 전체 테이블을 FULL SCAN 할 수도 있고
INDEX 영역을 FULL SCAN할 수도 있습니다.
TABLE을 전체 FULL SCAN 할 때와 INDEX영역을 FULL SCAN할 때
어디가 빠르다고는 장담하지 못합니다.
이러한 경우 테이블 이나 인덱스의 단일 블록을 SCAN하기 때문에
예측하기가 애매합니다...
인덱스를 SCAN하는데 하나의 블록이 아니라 MULTI BLOCK을 SCAN한다면 어떨까요?
당연히 SINGLE BLOCK을 SCAN하는 것보다 빠를 수 있습니다.
이때 사용하는 것이 INDEX FAST SCAN이라는 것인데 COUNT하는 경우 당연히 속도가 빨라 집니다.힌트 INDEX_FFS를 이용하면 됩니다.
SQL)SELECT COUNT(*) FROM EMP;
Execution Plan
------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF ‘EMP’
SQL)SELECT /*+ INDEX(EMP pk_emp) */ COUNT(*) FROM EMP;
Execution Plan
------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 INDEX FULL SCAN OF ‘pk_emp’ (UNIAUE) (cost=30)
---------------------------------------------
인덱스 패스트 스캔 이용
---------------------------------------------
SQL)SELECT /*+ INDEX_FFS(EMP pk_emp) */ COUNT(*) FROM EMP;
Execution Plan
------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF ‘pk_emp’ (UNIQUE) (cost=2)
아래의 예는 성능향샹 테스트를 한 결과 입니다.
데이터는 5만건 입니다.
select count(idx) idx from TESTBBS
- 소요시간 : 225ms
select /*+ INDEX_FFS(TESTBBS TESTBBS_IDX) */ count(idx) idx from TESTBBS
- 소요시간 : 17ms
'프로그래밍 > oracle' 카테고리의 다른 글
oracle - 오라클(ORACLE) DB사전(DICTIONARY) 정리 (0) | 2012.08.17 |
---|---|
oracle - DB 링크 및 스냅샷 (0) | 2012.08.17 |
oracle - 오라클 CLOB 타입 검색 (0) | 2012.08.17 |
oracle - 25가지 효율적인 SQL 작성법 (0) | 2012.08.17 |
oracle - [Hint]힌트는 이런식으로 사용합니다. (0) | 2012.08.17 |