본문 바로가기

프로그래밍/oracle

oracle - COUNT(*)를 빠르게 하기

반응형

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 

 


반응형