SQL 튜닝의 시작 (2013년)
조회 컬럼과 변수의 데이터 타입을 맞추자 0 0 99,999+

by 구루비스터디 컬럼변형 [2018.07.14]


조회 컬럼과 변수의 데이터 타입을 맞추자

  • 조회조건에 적합한 인덱스가 있는데도 인덱스 스캔으로 처리 되지않고 Full Table Scan을 하는 경우가 있는데, 왜 이런 현상이 발생하는 건가요?


  • 이러한 현상은 대부분 WHERE 절에서 사용된 컬럼과 조회 변수값의 데이터 타입(컬럼:VARCHAR2, 조건:NUMBER)다르기 때문에 발생된다.
  • 또한, 통계정보의 의한 OPTIMIZER의 판탄오류, DB서버 파라미터 설정 중 BIND PEEKING에 의해서 발생된다.


스크립트생성

CREATE TABLE T1 AS
SELECT 1000000-(LEVEL-1) C1
      ,TO_CHAR(SYSDATE-(LEVEL-1),'YYYYMMDD') C2
 FROM DUAL
CONNECT BY LEVEL <= 1000000

CREATE INDEX IDX_T1_01 ON T1(C1);
CREATE INDEX IDX_T1_02 ON T1(C2);

BEGIN 
  DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'BSHMAN'
                                ,TABNAME=>'T1'
                                ,ESTIMATE_PERCENT=>99
                                ,METHOD_OPT=>'FOR ALL INDEXED COLUMNS'
                                ,GRANULARITY=>'ALL'
                                ,CASCADE=>TRUE
                                ,NO_INVALIDATE=>FALSE);
END;


테스트[1]. VARCHAR2(8) 타입인 C2를 조회하는 변수의 타입이 NUMBER일 때


컬럼 데이터 타입 - VARCHAR2(8)
변수 데이터 타입 - NUMBER
SELECT *
 FROM T1
WHERE C2= 20110124

Plan hash value: 3617692013
 
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     2 |    26 |   647  (10)| 00:00:08 |
|*  1 |  TABLE ACCESS FULL| T1   |     2 |    26 |   647  (10)| 00:00:08 |
--------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
--------------------------------------------------- 
   1 - filter(TO_NUMBER("C2")=20110124)  ----> 내부에서 컬럼변형으로 인덱스를 사용하지못함
   



테스트[2].NUMBER 타입인 C1을 조회하는 변수의 타입이 VARCHAR2일경우


컬럼 데이터 타입 - NUMBER
변수 데이터 타입 - VARCHAR2

SELECT *
 FROM T1
WHERE C1='111111';
 
Plan hash value: 3018735338
 
-----------------------------------------------------------------------------------------
| Id  | Operation                   | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |           |     1 |    13 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1        |     1 |    13 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_T1_01 |     1 |       |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("C1"=111111)     <---- 컬럼 변형없이 인덱스 스캔처리
   

"데이터베이스 스터디모임" 에서 2013년에 "SQL튜닝의시작 " 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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