조시형의 ‘친절한 SQL 튜닝’
왜 이러는 걸까요?
기고자 조시형
- 現) 디비안 대표이사 / 前) 엔코아, 비투엔
- 제1회 우수DB人상 수상 / 국가공인 SQLP, DAP 자격검정 전문위원
- 저서 : 친절한 SQL 튜닝, 오라클 성능 고도화 원리와 해법, 비용기반의 오라클
원리(공역)
‘친절한 SQL 튜닝’, ‘오라클 성능 고도화’ 저자로 유명한 조시형은 엔코아, 비투엔
을 거쳐 지금은 디비안 대표이사를 맡고 있다. 제1회 우수DB人상을 수상하기도 한 그는 20년 가까이 컨설팅을 수행하면서 터득한 성능관리 방법론을 솔루션화하는 일에 관심이 많고, DB 전문서적을 꾸준히 집필하면서 교육과 후배 양성에도 더 매진하려고 노력 중이다. 요즘은 인터넷 카페를 통한 지식공유 활동에도 열심인데, 그가 운영하는 ‘디비안 포럼(www.dbian.net)’을 방문하면 DB 관련 고급 기술자료, SQLP/DAP 자격증에 관한 정보를 습득할 수 있고, 직접 저술한 책에 대한 Q&A 서비스도 받을 수 있다.
어느 날 튜닝하다가 아래 프로그램을 발견했다.

[프로그램 1]
이 프로그램을 발견하는 순간, 드는 생각! 왜 이러는 걸까?

[그림1]
아래와 같은 단일 UPDATE 문으로 처리할 수 있는데, 개발자는 왜 루프(Loop)를 선택했을까?

[프로그램 2]
아래 표는 이제 더는 사용되지 않는 규칙기반 옵티마이저(Rule-Based Optimizer, RBO)가 내부적으로 사용하던 우선순위 규칙이다.

[표 1] RBO 우선순위 규칙
앞서 본 프로그램 개발자는 테이블을 액세스하는 가장 빠른 경로가 ‘(1순위) Single Row by ROWID’라는 사실에 착안하지 않았을까 싶다. 내 추측이 맞는다면, 해당 개발자에게 아래 두 가지 개념을 알려주고 싶다.
첫째, ‘테이블 랜덤 액세스’에 대한 개념이다. 테이블 랜덤 액세스란, ROWID에서 얻은 주소 값을 이용해 테이블 블록을 찾아가는 과정을 말한다. 한 로우를 읽기 위해 해당 로우가 속한 블록(8KB)를 통째로 읽어야 하니 기본적으로 비효율을 내포한다. 블 ....