-
7. 친절한 SQL 튜닝IT 서적/친절한 SQL 튜닝 2023. 10. 21. 09:32
인덱스 설계
인덱스 스캔 방식에 여러 가지가 있지만, 가장 정상적이고 일반적인 방식은 Index Range Scan이다. 이를 위해서는 인덱스 선두컬럼을 반드시 조건절에 사용해야 한다. 아래 두 가지 선택 기준은 Index Range Scan을 하기 위해 필요한 조건으로서 공식처럼 외워야 한다.
1. 조건절에 항상 사용하거나, 자주 사용하는 컬럼을 선정한다.
2. '='조건으로 자주 조회하는 컬럼을 앞쪽에 둔다.소트 연산을 생략하기 위한 컬럼 추가
인덱스는 항상 정렬상태를 유지하므로 ORDER BY, GROUP BY를 위한 소트 연산을 생략할 수 있게 해준다. 따라서 조건절에 사용하지 않는 컬럼이더라도 소트 연산을 생략할 목적으로 인덱스를 구성에 포함시킴으로써 개선을 도모할 수 있다.
1. 소트 연산에 사용되는 컬럼을 인덱스로 설정
2. equal ('=') 연산자로 사용한 조건절 컬럼 설정IN 조건은 '='이 아니다.
SELECT 고객번호 ,고객명 ,거주지역 FROM 고객 WHERE 거주지역 = '서울' AND 혈액형 IN ('A', 'O') ORDER BY 연령
위와 같은 쿼리문이 있을 때, IN 연산이 '=' 연산이 되려면 IN-List Iterator 방식으로 풀려야 한다. 아래와 같이..
SELECT 고객번호 , 고객명 , 거주지역 FROM 고객 WHERE 거주지역 = '서울' AND 혈액형 = 'A' UNION ALL SELECT 고객번호 , 고객명 , 거주지역 FROM 고객 WHERE 거주지역 = '서울' AND 혈액형 = 'O' ORDER BY 연령
위와 같은 경우 ORDER BY가 아래 쿼리문에만 적용돼 있어 정확하게 정렬이 되지 않는다. 즉, 소트 연산을 생략하려면 IN 조건절이 IN-List Iterator 방식으로 풀려선 안 된다. ==> 인덱스를 수정해야 하는데, 운영계에서는 사용되는 DB의 인덱스를 변경하는 일은 쉬운 일이 아니다. IN 조건절을 인덱스 액세스 조건으로 사용하면 안된다. 필터 조건으로만 사용해야 한다.
물론 쿼리를 많이 짜본 사람은 아래와 같이 변형해서 정렬할 수 있다. SELECT 구문으로 묶고 ORDER BY를 하단에 추가했다.
SELECT 고개번호 ,고객명 ,거주지역 FROM ( SELECT 고객번호 , 고객명 , 거주지역 , 연령 FROM 고객 WHERE 거주지역 = '서울' AND 혈액형 = 'A' UNION ALL SELECT 고객번호 , 고객명 , 거주지역 , 연령 FROM 고객 WHERE 거주지역 = '서울' AND 혈액형 = 'O' ) ORDER BY 연령
'IT 서적 > 친절한 SQL 튜닝' 카테고리의 다른 글
9. 친절한 SQL 튜닝 (0) 2023.10.21 8. 친절한 SQL 튜닝 (0) 2023.10.21 6. 친절한 SQL 튜닝 (0) 2023.10.20 5. 친절한 SQL 튜닝 (0) 2023.10.20 4. 친절한 SQL 튜닝 (0) 2023.10.20