성별을 기준으로 몇 명의 사원이 있는지 출력하는 쿼리가 있다고 하자. 이때 성별의 값이 NULL이라면 'NO DATA'라고 출력하도록 IFNULL() 함수로 작성했다.
튜닝 전 실행 계획은 다음과 같다.
Key
항목이 I_성별_성 이므로 인덱스 풀 스캔 방식으로 수행되며, Extra
항목이 Using temporary이므로 임시 테이블을 생성한다.
튜닝하기 전의 SQL 문을 실행한 결과 사원
테이블의 성별
컬럼에는 NULL값이 존재하지 않는다는 사실을 확인했다. 더군다나 만약 성별
컬럼에 NOT NULL
속성이 설정되어 있다면, 해당 컬럼에는 더더욱 NULL이 존재할 수 없다. 따라서 NULL값을 처리하기 위해 사용한 IFNULL() 함수는 불필요한 로직임에도 불구하고 DB 내부적으로 별도의 임시 테이블을 생성하므로, 튜닝의 대상이 된다.
IFNULL()을 제거한 SQL문과 그 실행 결과는 다음과 같다. 실행 시간은 1.04초
에서 0.17초
로 향상되었다.
튜닝 후 실행 계획을 살펴보면, Extra 항목이 Using index 이므로 임시 테이블 없이 인덱스만 사용하여 데이터를 추출함을 알 수 있다.