본문 바로가기

DB

오라클 티베로 OR절 속도 느린 이유 인덱스 안타기 때문에 풀스캔

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%'