SQL 튜닝 결과보고
- 오라클 기준
- 8가지 사례소개
*블록IO
- 블록IO 를 줄이면 수행시간 단축 가능
- DBMS에서 IO는 블록단위로 이루어짐
- 레코드를 읽을때 레코드가 속한 블록 전체를 읽게됨
- 따라서 블록IO개수는 쿼리 실행할때 읽게되는 블록의 개수
- 보통 한번 가져올때 블록 128개 가져옴
- 인덱싱된 로우 가져올때는 싱글블록IO(블록1개만가져올수잇음)
- MSSQL 에서는 페이지라는 용어 사용
*스칼라 서브쿼리
- 스칼라 서브쿼리 쓰면 버퍼캐시에 캐싱이 되기때문에 부하감소
- 예를 들어 1을 입력한후 다음번에도 1을 입력하면 미리 캐시된 값이 나가서 시간 단축
- 리컬시브 콜을 감소
- 근데 입력값이 유니크한것보다 변별력없을때 성능이 더 좋아짐
- 사용시 밑져야 본전이므로 스칼라서브쿼리 사용을 표준으로 잡는것도 나쁘지않음
*쿼리변환
- 결합된 쿼리 개선 > 결합을 풀거나 다른방식으로 진행
- 보통은 옵티마이저가 알아서 잘해주지만... 잘 안될때도잇음
*인덱스
- 인덱스를 쓰면 빠르다고 생각하는데 인덱스를 타서 테이블로 가는것도 부하가 생기므로 건수가 적으면 안쓰는게 나음
- 예를들어 3만건이면 풀스캔이 나음 인덱스쓰면 3만번도는거
*파티션 프루닝
- 읽지않아도되는 파티션을 제외시키는 법
*NL조인?
- Nested Loops
*view push predicate
- 힌트를 줘서 WITH 문 부터 실행하는게 아니라 인라인을 먼저 실행해서 WITH문에 더 좋은조건을 주는것
- WITH절에 무조건 이걸 쓰는게 좋은건 아니고 해당하는 케이스에만 사용
*SQL 튜닝의 시작 책
*View Merging
- 큰쿼리안에 작은쿼리 감싸고 있는 경우 작은쿼리를 큰쿼리 레벨로 올리는 것
- 뷰머징이 실패할 경우가 많음 >내부로직이 복잡해서 > 노머징 힌트를 주고 반대로 작은쿼리로 데이터를 던져주는방식으로 view push predicate 유도