본문 바로가기
Oracle

[Oracle] 쿼리튜닝 : 인덱스를 타지 않는 SQL(쿼리)

by 상후 2021. 8. 22.
728x90
반응형

 

인덱스를 타지 않는 SQL(쿼리) 및 경우 & 인덱스 활용한 쿼리 작성 시 고려사항

인덱스가 생성되어 있어도 좋지 못한 쿼리를 작성하면 옵티마이저가 인덱스를 안태울 수 있다..

쿼리 작성 시 위 내용을 알지 못해 좋지 않은 쿼리를 작성을 했었다.

 

쿼리를 분석하고 개선(튜닝)할 때 해당 내용만 고려하여 수정해도 제법 개선이 되는 부분이 많다.

 

인덱스를 타지 않는 쿼리 및 케이스를 정리하며 한번 더 학습합니다.

 

0. 인덱스를 타지 않는 SQL 및 케이스

 

  • 인덱스 컬럼의 변형
  • 내부적인 데이터 변환
  • NULL 조건 사용
  • 부정형 조건 사용
  • LIKE 연산자 사용

 

1. 인덱스 컬럼의 변형

인덱스가 적용된 컬럼을 변형해서 사용할 시 사용이 불가능합니다.

인덱스 컬럼에 연산을 하거나, 형 변환을 하는 경우입니다.

 

비교대상(인덱스 컬럼)을 변형하지 말고,  값을 적절히 변형하여 사용합시다.

 

SELECT * FROM EMP WHERE SAL*10 > 1000;	-- INDEX 사용 X
SELECT * FROM EMP WHERE SAL > 1000/10;	-- INDEX 사용 O

SELECT * FROM EMP WHERE TO_CHAR(hire_date, 'YYYY') = '2021';	-- INDEX 사용 X
SELECT * FROM EMP WHERE hire_date = TO_DATE('2021', 'YYYY');	-- INDEX 사용 O

 

2. 내부적인 데이터 변환

컬럼의 데이터 타입과 맞지 않는 값과 비교 연산을 하면,

조회는 정상적으로 이뤄질 수 있어도 내부적으로 데이터 타입 변환이 일어납니다.

 

정확히 데이터 타입을 일치시켜주도록 합시다.

 

SELECT * FROM CUSTOMER WHERE AGE = '26';	-- INDEX 사용 X
SELECT * FROM CUSTOMER WHERE AGE = 26;		-- INDEX 사용 O

 

3. NULL 조건 사용

 

SELECT * FROM CUSTOMER WHERE AGE IS NULL;	-- INDEX 사용 X
SELECT * FROM CUSTOMER WHERE AGE > 0;		-- INDEX 사용 O

 

4. 부정형 조건 사용

부정형을 사용하면 인덱스를 활용하지 못한다.(제외한 값을 모두 찾아야 하기때문이라 생각)

자주 실수하던 유형입니다. 부정형 조건을 쓸 때 충분히 고려합시다.

 

SELECT * FROM CUSTOMER WHERE AGE != 20;				-- INDEX 사용 X
SELECT * FROM CUSTOMER WHERE AGE < 20 AND AGE > 20;		-- INDEX 사용 O

 

5. LIKE 연산자 사용

LIKE 연산자를 사용할 때 %ABC 이렇게 앞부분에 %를 넣으면 인덱스를 타지 않는다.

(모두 허용하기 때문 인 것 같다.)

사용하고 싶다면 ABC% '%'는 맨 앞에 넣지 말자 

 

SELECT * FROM CUSTOMER WHERE NAME LIKE '%A%';	-- INDEX 사용 X
SELECT * FROM CUSTOMER WHERE NAME LIKE 'A%';	-- INDEX 사용 O

 


위 내용을 고려하여 쿼리를 작성하고

쿼리 작성 후 꼭 실행계획을 확인하자 !

728x90
반응형

댓글