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
반응형
'Oracle' 카테고리의 다른 글
[Oracle] ORA-01789 : 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다. (0) | 2021.09.26 |
---|---|
[Oracle] ORA-12733 : 정규 표현식이 너무 깁니다. (0) | 2021.09.01 |
[Oracle] 테이블명 & 컬럼명 변경하기 (0) | 2021.08.15 |
[Oracle] 테이블 컬럼 추가, 수정, 삭제하기 (0) | 2021.08.15 |
[Oracle] ORA-00001 : 유일성(무결성) 제약조건에 위배됩니다 (0) | 2021.08.07 |
댓글