2019.09.22 [튜닝공부]
1. 내부적 형변환
만일, 인덱스에 포함되어 있는 컬럼을 조건에 걸어줬는데도 full scan 을 하는 경우가 있다면,
인덱스의 컬럼 데이터 형 또한 고려해주어야 한다.
인덱스 컬럼이 varchar 형인데 불구하고, 숫자로 조건을 걸어주었다면
이를 위해 컬럼의 값을 숫자로 형변환한다. 따라서, 인덱스가 걸리지 않고 full scan 을 타는 경우가 존재한다고 한다.
출처 : 구루비
http://www.gurubee.net/lecture/2122
2. 외부적 형변환
보통, 화면에서는 컬럼과 다른 데이터형을 가지고 있어서, 컬럼 형식을 가공하는 경우도 있다.
예를들면 date 타입의 컬럼 인덱스가 걸려있는데, 이 컬럼을 가져올 때 TO_CHAR 함수를 사용해 년월일 만 가져온다던지 하는 경우다.
그런 경우도 인덱스를 타지 못한다고 한다.
SELECT EMPNO
, JOB
, TO_CHAR(HIREDATE, 'YYYYMMDD') HIREDATE
, DEPTNO FROM
(SELECT EMPNO
, JOB
, HIREDATE
, DEPTNO
FROM EMP
) EMP_V
WHERE EMP_V.HIREDATE BETWEEN :B1 -- 2009/01/01 00:00:00 AND :B2 -- 2009/01/31 23:59:59
EMP 테이블의 HIREDATE 를 가공하지 않고 가지고 올 수 있도록 EMP_V 를 만들고, 이를 한번 감싸 밖에서 TO_CHAR 함수를 통해 원하는 형식으로 변환해준다.
변수를 Date 타입으로 받도록 수정하여 주면, 인덱스를 탈 수 있다고 한다.
http://www.gurubee.net/lecture/2125
3. Local Hint 로 인한 비효율
공용으로 쓰는 View 에 로컬 힌트를 걸어준 경우도 있다. 이런 경우, 로컬 힌트 때문에 제대로 인덱스를 타지 않는 경우가 생길 수 있다.
'공부 > DB' 카테고리의 다른 글
[SQL] ROWNUM 적용한 페이징 쿼리 (0) | 2021.02.20 |
---|---|
쿼리(LEAD) (0) | 2021.02.18 |
[SQL] ROWNUM = 2 (2) | 2021.01.15 |
[SQL] Order by 문 변형 (0) | 2021.01.15 |
[중첩루프조인] 오라클 조인 Nested Loop Join (0) | 2019.12.02 |
댓글