SQL Tuning
SQL Tuning
SQL Tuning이란
SQL 쿼리를 보내는 방식에 따라 성능 차이 존재. 따라서 SQL문을 최적화하여 시간을 단축하는 행위. 다음과 같은 방법들 사용.
커서 사용 자제
- 커서는 속도를 저하시키고, 작업을 block시킴으로 인해 동시성을 저하시킴.
커서 사용 시 임시 테이블 사용
- 데이터를 잠시 저장하는 임시 테이블을 만들고 해당 테이블에서 커서를 사용 시 동시성 증진.
조인 시 임시 테이블 활용
- 두 테이블을 조인할 때 큰 테이블의 데이터를 임시 테이블로 끌어와 사용하는 방법으로 성능 개선.
미리 데이터 준비
- 작업 시작전 조인이 예상되는 테이블의 데이터를 미리 조인해서 준비하기.
복합 뷰 최소화
- 과한 뷰의 중첩은 성능 저하 야기.
UPDATE 대신 CASE 사용
- 특정 조건을 만족시키는 행을 업데이트 하는 경우 두 번의 작업이 발생. CASE 이용시 성능 향상.
스칼라 함수 대신 테이블 반환 함수 사용
- SELECT문에서 스칼라 함수를 사용하는 자리에 테이블 자체를 반환하는 함수를 이용하면 성능 향상.
SQL 서버에서 분할 활용
- 데이터 엔진에서 제공하는 테이블을 자동 분할 기능 사용.
갱신 / 삭제를 배치로
- 갱신 / 삭제를 작은 단위로 나눠서 수행하면 동시성 향상.
ORM 회피
- ORM은 심각한 성능 하락 발생 가능.
저장 프로시저 사용
- 짧은 호출로 인해 트래픽 감소, 오류 추적 용이.
중복 처리 (Double Dipping) 회피
- 저장 프로시저로 인해 여러 개의 쿼리를 큰 테이블에 대해 실행 후 이 결과들을 다시 조인하는 상황이 생길 수 있음. 큰 테이블에 한 번의 쿼리만 실행하도록 수행.
커다란 트랜잭션 쪼개기
- 트랜잭션 내에서 여러 테이블을 처리하는 경우 block을 여러 테이블에 걸어 성능 하락 발생. 각각 한 테이블에 대한 트랜잭션으로 쪼개면 동시성 향상
트리거 사용 자제
- 트리거 사용으로 인해 여러 테이블을 잠구는 현상 발생 가능. 트리거를 쪼개거나 아예 사용 자제.
GUID(범용 고유 식별자) 사용 회피
- 테이블 정렬을 위해 범용 고유 식별자를 사용하면 테이블이 파편화될 수 있음.
테이블의 모든 것 카운트 금지
- 데이터의 존재 여부만 확인한다면 EXISTS를 사용.
시스템 테이블을 통해 행을 카운트
- SELECT rows FROM sysindex를 통해 인덱스의 행의 수를 알 수 있음.
필요한 열만 가져오기
- 필요한 열 외의 다른 데이터를 가져오면 큰 낭비
부등호를 이용한 검색 회피
- ID <> 3을 검색하는 경우 ID > 3 의 결과와 ID < 3 의 결과를 합치는 것이 나음. 이 경우 index를 사용 가능.
WHERE에서 최대한 인덱스 컬럼 사용하도록 작성
- WHERE에서 조건을 명시하는 방법에 따라 인덱스를 사용하지 않을 수도 있음. 인덱스를 사용할 수 있도록 작성.
인덱스 사용시 최대한 등호 사용
- 인덱스 컬럼에서 LIKE, NOT IN, IS NULL 등의 연산자를 사용하면 효율 감소.
인덱스 컬럼 사용시 변형 자제
- 인덱스 컬럼의 값을 변형해서 사용한다면 인덱스를 사용하지 않음.
OR 대신 AND
- OR 연산자는 내부적으로 UNION ALL로 변환되므로 성능 하락 가능.
HAVING 보다는 WHERE에서 필터링
- WHERE이 HAVING보다 순서가 빠르므로 WHERE에서 데이터를 먼저 필터링 하면 성능 향상.
DISTINCT 자제
- 내부적으로 정렬 작업 수행으로 인한 성능 하락.
IN 대신 EXISTS
- EXISTS를 사용하는 경우 비용이 훨씬 하락. 테이블이 큰 경우 더욱. NOT IN 대신 NOT EXISTS도 동일.
UNION 대신 UNION ALL 사용
- UNION의 경우 동일한 행을 필터링하는 과정으로 인한 성능 하락.