본문 바로가기

개발/Database

SQL 튜닝

같은 결과의 쿼리는 여러 형태로 작성될 수 있으며 옵티마이저가 실행계획을 생성할 때 최대 성능의 쿼리를 작성해야 한다.

옵티마이저는 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해주는 DBMS 내부의 핵심 엔진이다.

사용자가 구조화된 질의언어로 결과집합을 요구하면 이를 생성하는데 필요한 처리경로는 DBMS에 내장된 옵티마이저가 자동으로 생성해주며 이 처리 경로를 실행계획이라고 부른다.

더 높은 성능의 쿼리를 작성하기 위한 튜닝 가이드라인을 작성한다.

 

1. WHERE 조건에 인덱스 모두 사용
TEST 테이블에서 TEST_NO, TEST_CONTEXT 컬럼이 TEST_NO_IDX 인덱스로 존재할 때 아래 쿼리는 인덱스를 사용하지 않는다.

SELECT *
FROM TEST
WHERE TEST_COTEXT = 'OPTION'

아래와 같이 사용하면 인덱스를 사용하게 된다.

SELECT *
FROM TEST
WHERE TEST_NO = 1
AND TEST_CONTEXT = 'OPTION'

2. LIKE 보다는 = 를 사용
LIKE 등의 연산자는 인덱스 효율이 떨어진다.
IS NULL, IS NOT NULL, NOT IN 등의 경우에도 인덱스 효율이 떨어진다.

3. 인덱스 컬럼은 변형하지 않고 사용
SUBSTR등으로 인덱스 컬럼의 값을 변경하면 FULL SCAN을 하게된다.

4. AND를 사용
옵티마이저의 OR-Expansion 처리는 OR 연산자의 쿼리를 UNION ALL로 변환하여 쿼리의 성능이 저하된다.

5. HAVING 보다 WHERE 을 사용
그룹핑 쿼리 처리 순서상 WHERE 이 먼저 처리되므로 필터링 대상은 WHERE 조건에서 처리할 수 있또록 작성해야 한다.

6. DISTINCT 사용 지양
키워드 내부적으로 정렬 작업을 진행하므로 꼭 필요한 경우가 아니면 사용을 지양한다.

7. EXISTS, NOT EXISTS를 사용
IN, NOT IN 연산자보다 EXISTS나 NOT EXISTS를 사용하는 것이 더 좋은 성능을 발휘한다.

8. SET 연산자 사용시 UNION ALL 사용
UNION 연산자는 동일한 로우를 제거하고 한 로우만 반환한다.
필터링 로직이 숨어 있어 UNION ALL 보다 실행 비용이 높다.

반응형

'개발 > Database' 카테고리의 다른 글

Index  (0) 2020.06.05
SQL - GROUP BY, HAVING  (0) 2020.06.05
저장 프로시저(Stored Procedure)  (0) 2020.06.05
트랜잭션 (Transaction)  (0) 2020.06.05
데이터베이스 (Database)  (0) 2020.06.05