ORACLE TIBERO OR절 INDEX 문제
오라클 티베로에서 INDEX를 타지 않는 경우
- WHERE절에 NOT NULL 또는 NULL을 사용할 때
- LIKE 연산자를 사용할 때
- OR 조건을 사용할 때
OR절 대신 UNION ALL 사용
WHERE절에 OR를 사용하게 되면 인덱스를 타지 않아 데이터가 대용량이 아니어도 굉장히 느려지는 일이 발생할 수 있다.
SELECT *
FROM USER_TABLE A
LEFT JOIN JOIN_TABLE B ON A.ID = B.ID
WHERE
A.NAME IS NOT NULL
OR B.NAME = 'TEST'
OR절로 인해 조회가 느려질 경우 OR절 대신 UNION ALL 을 사용하여 대체할 수 있다.
SELECT *
FROM USER_TABLE A
LEFT JOIN JOIN_TABLE B ON A.ID = B.ID
WHERE
A.NAME IS NOT NULL
UNION ALL
SELECT *
FROM USER_TABLE A
LEFT JOIN JOIN_TABLE B ON A.ID = B.ID
WHERE
OR B.NAME = 'TEST'
- UNION : 각각의 쿼리의 합을 합한다. (중복제거)
- UNION ALL : 각각의 쿼리의 합을 합한다. (중복포함)
UNION ALL 대신 USE_CONCAT 사용
/*+ USER_CONCAT */ 을 사용하면 SQL을 UNION ALL로 분리하지 않아도 조건에 맞는 인덱스를 사용한다고 한다.
WHERE절의 OR를 UNION ALL로 변경하여 수행을 한다고 한다.
티베로에서는 USE_CONCAT가 없는 것 같다.
오라클에서만 가능할 듯..
SELECT * /*+ USE_CONCAT */
FROM USER_TABLE A
LEFT JOIN JOIN_TABLE B ON A.ID = B.ID
WHERE
A.NAME IS NOT NULL
OR B.NAME = 'TEST'
LIKE 연산자를 사용할 때
LIKE절에 %를 앞뒤 또는 앞에 붙이면 인덱스를 타지 않는다.
SELECT USER_NAME FROM TABLE_NAME WHERE USER_NAME LIKE '%NAME%'
SELECT USER_NAME FROM TABLE_NAME WHERE USER_NAME LIKE '%NAME'
LIKE절 뒤에 %를 붙이면 인덱스를 탄다.
SELECT USER_NAME FROM TABLE_NAME WHERE USER_NAME LIKE 'NAME%'
'DB' 카테고리의 다른 글
데이터베이스 무료 툴 dbeaver 무료 다운로드 설치 방법 사용법 (0) | 2022.12.03 |
---|---|
[Tibero studio] 티베로 스튜디오 사용법 단축키 모음 (0) | 2022.12.02 |
[Oracle] 오라클 DB LINK 설정하는 방법 tnsnames.ora과 명령어 설정 (0) | 2021.04.13 |
[Oracle] 오라클 커넥션 풀 확인(session, processes) (0) | 2021.02.10 |
[Oracle] 오라클 시노님(Synonmy) 사용하기 위한 권한 주고 등록(insufficient privileges) (0) | 2021.01.27 |