쿼리 성능 향상

Programmingzi·2024년 4월 14일

DB에 저장된 데이터의 용량이 크다면, 쿼리의 성능까지 고려해야 한다.
쿼리의 성능을 향상시키기 위한 방법

1. IN보단 EXISTS를 사용하기

exists는 서브쿼리에 일치하는 결과가 한 건이라도 있으면, 쿼리를 더이상 수행하지 않기 때문에 in절보다 성능이 더 좋다. 반면, in은 서브쿼리의 결과를 모두 수행하기 때문에 in보다는 exists를 사용하는 것이 성능이 좋다.
또한, exists를 사용할 땐 존재 여부만 확인하면 되므로 rownum = 1을 서브쿼리의 조건절에 추가하면 좋다.

select *
from student s
where id exists (select 1
				from school scl
                where s.id = scl.student_id
                and rownum = 1);

2. 파티션 또는 인덱싱되어있는 컬럼을 조건절에 걸어주기

파티션 또는 인덱싱된 컬럼을 조건절에 걸어주면 성능이 향상된 것을 query plan을 통해 확인할 수 있다.

파티셔닝이란?
테이블의 특정 컬럼값을 기준으로 데이터를 분할해 저장해놓은 테이블이다. 이때, 논리적인 테이블을 1개이지만 물리적으로는 분할한만큼 파티션이 만들어져 입력되는 컬럼값에 따라 분할된 파티션별로 데이터가 저장된다.

인덱싱이란?
테이블의 검색 성능을 높여주는 자료구조이다. 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터를 정렬해서 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다.

3. Oracle Hint 사용하기

Oracle Hint란?
Oracle Hint는 일종의 지시 구문으로, 오라클이 상항 최적의 실행 경로를 만들어내기는 불가능하기 때문에 직접 최적의 실행 경로를 작성해주는 것이다.
힌트를 통해 SQL문 실행을 위한 스캐닝하는 경로, 조인하는 방법 등을 알려준다.

단, 무분별한 힌트의 사용은 성능의 저하를 초래하기 때문에 적절하게 사용해야 한다.

3-1. Parallel Execution
여러개의 프로세스를 병렬로 동시에 띄워서 SQL을 실행한다.

select /*+parallel(table_name, degree)*/
from employee 
  • 설정한 개수만큼 server proceess(deree)가 동시에 실행된다.
  • 시스템 자원을 많이 사용하기 때문에 보통 마지막으로 시도하는 쿼리 튜닝이다.
  • 한꺼번에 여러 명이 동시에 실행하면, DB가 뻗을 수 있다.

4. 서브쿼리보다는 JOIN 사용하기

SQL에 서브쿼리가 여러 개 존재할 경우 Optimizer가 최적화 과정에서 잘못된 cost 계산을 하는 경우가 많이 발생하기 때문!




참고
https://devuna.tistory.com/35

0개의 댓글