이미 소장하고 있다면 판매해 보세요.
|
CHAPTER 1. 비용(COST)이란?
옵티마이저 옵션 1 비용(COST)의 의미 3 쿼리 변환과 비용 계산 6 위지위그 9 요약 10 테스트 스크립트 10 CHAPTER 2. 테이블 스캔 시작하면서 12 지속적인 개선 17 블록 크기의 효과 18 CPU costing 20 CPU costing의 위력 28 BCHR은 죽었다! BCHR은 영원하다! 31 병렬 실행 35 Index Fast Full Scan 38 파티셔닝 42 요약 48 테스트 스크립트 49 CHAPTER 3. 단일 테이블 선택도 시작하면서 51 NULL 값 처리 54 IN-LIST 처리방식 56 10g 업데이트 61 범위 기반 검색조건 62 10g 업데이트 67 조건절이 두 개일 때의 처리방식 68 다중 조건일 때의 문제점 71 요약 74 테스트 스크립트 75 CHAPTER 4. 단순 B-tree 액세스 기본적인 인덱스 비용 계산식 77 시작하면서 80 유효 인덱스 선택도 83 유효 테이블 선택도 84 클러스터링 팩터 85 인덱스 액세스 비용에 대한 종합적인 검토 87 알고리즘의 확장 89 세 가지 선택도 98 CPU costing 103 끝으로 106 요약 107 테스트 스크립트 108 CHAPTER 5. 클러스터링 팩터 기준 예제 110 테이블 경합 줄이기(다중 freelist) 113 leaf 블록 경합 줄이기(reverse key 인덱스) 117 테이블 경합 줄이기(ASSM) 120 RAC에서 경합 줄이기(Freelist Groups) 123 인덱스 컬럼 순서 126 인덱스 컬럼 추가 129 통계정보 바로잡기 132 sys_op_countchg( ) 테크닉 132 비공식 전략 138 끝으로 139 요약 139 테스트 스크립트 140 CHAPTER 6. 선택도 이슈 여러 가지 데이터 타입 142 날짜 값 142 문자열 값 143 부적절한 데이터 타입 145 ‘0’으로 문자 앞쪽을 채울 때의 문제점(leading zeros) 150 치명적인 문제를 유발하는 디폴트 값 152 이산(discrete) 값의 위험성 154 10g 업데이트 159 놀라운 sysdate 159 함수의 특성 162 상관관계에 있는 컬럼 164 동적 샘플링 167 옵티마이저 프로파일 170 이행적 폐쇄 172 제약이 만든 조건 176 요약 180 테스트 스크립트 181 CHAPTER 7. 히스토그램 시작하면서 183 일반적인 히스토그램 190 히스토그램과 바인드 변수 191 오라클은 언제 히스토그램을 무시하는가? 193 도수분포 히스토그램 197 도수분포 히스토그램 조작하기 201 통계정보 조작 시 주의사항 202 높이균형 히스토그램 204 계산208 데이터 문제 다시 생각하기 212 부적절한 데이터 타입 212 위험한 디폴트 값 216 요약 218 테스트 스크립트 219 CHAPTER 8. 비트맵 인덱스 시작하면서 222 인덱스 컴포넌트 227 테이블 컴포넌트 229 비트맵 결합 231 낮은 카디널리티 234 NULL 컬럼 238 CPU costing 242 재미있는 사례들 244 다중 컬럼 인덱스 244 비트맵 변환 247 요약 250 테스트 스크립트 251 CHAPTER 9. 쿼리 변환 시작하면서 254 진화(Evolution) 258 필터링 258 필터 최적화(Filter Optimization) 263 스칼라 서브쿼리 266 서브쿼리 팩토링 274 Complex View Merging 281 Pushing Predicates 284 일반적인 서브쿼리 286 서브쿼리 파라미터 289 서브쿼리의 분류 290 세미 조인(Semi Joins) 298 안티 조인 301 안티 조인의 이상 현상 304 NULL과 NOT IN 305 Ordered 힌트 307 스타 변환 조인 309 스타 조인 317 향후 전망 319 요약 322 테스트 스크립트 323 CHAPTER 10. 조인 카디널리티 조인 카디널리티 기본 326 한 쪽에만 필터조건을 적용한 경우 331 실환경에서의 조인 카디널리티 334 확장과 예외 338 범위조건에 의한 조인 338 부등호 조인 340 조인하는 두 집합이 완전히 겹치지 않는 경우 343 히스토그램 345 이행적 폐쇄 349 세 개 이상 테이블을 조인할 경우 356 조인 컬럼에 Null 값을 갖는 경우 360 구현 이슈 364 골치 아픈 사항들 370 어이없는 버그 374 다른 관점에서의 접근 376 요약 378 테스트 스크립트 379 CHAPTER 11. NL(Nested Loops) 조인 기본 메커니즘 381 실사례 388 Sanity Checks 390 요약 396 테스트 스크립트 396 CHAPTER 12. 해시 조인 시작하면서 398 Optimal 해시 조인 403 Onepass 해시 조인 405 Multipass 해시 조인 412 트레이스 파일 417 10104 이벤트 417 10053 이벤트 419 골칫거리 421 전통적인 비용계산법 421 새로운 비용계산법 422 비교 테스트 422 다중 테이블 해시 조인 430 요약 433 테스트 스크립트 434 CHAPTER 13. 정렬과 머지 조인 시작하면서 438 메모리 사용 444 CPU 사용 446 sort_area_retained_size 450 pga_aggregate_target 452 실제 I/O 455 정렬 비용 458 10053 트레이스 458 비교 테스트 463 머지 조인 468 머지 메커니즘 468 첫 번째 집합을 정렬할 필요가 없는 머지 조인 474 카테지안 머지 조인 475 집계 478 인덱스 484 집합 연산자 485 마지막 당부 491 요약 493 테스트 스크립트 494 CHAPTER 14. 10053 트레이스 파일 쿼리문 496 실행계획 498 환경 499 트레이스 파일 501 파라미터 설정값 501 쿼리 블록 505 통계 정보 506 단일 테이블 508 Sanity Checks 510 General Plans 511 Join order[1] 512 Join order[2] 519 Join order[3] 521 Join order[4] 521 Join order[5] 522 Join order[6] 526 Join order[7] 526 Join order[8] 530 Join order[9] 532 Join order[10] 533 Join order[11] 533 Join order[12] 537 Join order[13] 539 Join order[14] 541 Join order[15] 542 Join order[16] 543 Join order[17] 543 Join order[18] 546 조인 평가 요약 548 테스트 스크립트 550 APPENDIX A 업그레이드 시 주의사항 dbms_stats 552 도수분포 히스토그램 553 CPU costing 554 반올림 오차 554 바인드 변수 Peeking 555 조인 컬럼에 NULL 값을 갖는 경우 556 B-tree에서 비트맵으로 전환 556 Index Skip-Scans 557 AND-Equal 557 인덱스 해시 조인 558 In-List 조건에 대한 비용계산의 개선 558 이행적 폐쇄 559 sysdate 계산식의 개선 560 구성 컬럼이 모두 NULL인 인덱스 엔트리 포함 561 pga_aggregate_target 561 정렬(Sorting) 562 그룹핑(Grouping) 563 Sanity Checks 563 조건식이 컬럼 한계 값을 벗어나는 경우 563 데이터 타입 조작 564 옵티마이저 모드 564 역순정렬 인덱스 565 Complex View Merging 565 Unnest 서브쿼리 565 스칼라 및 필터 서브쿼리 566 병렬 쿼리의 변화 x 2 566 동적 샘플링 567 임시 테이블 567 딕셔너리 통계정보 568 APPENDIX B 옵티마이저 파라미터 optimizer_features_enable 570 10053 트레이스 파일 572 v$sql_optimizer_env 577 인덱스579 |
|
대부분의 상용 DBMS는 탄생 초기부터 비용기반 옵티마이저(CBO)를 채택하였다. 하지만, 역사가 좀더 오래된 오라클은 최근까지도 규칙기반 옵티마이저(RBO)와 비용기반 옵티마이저 모두를 지원해왔고, 비교적 경험이 많은 오라클 개발자일수록 규칙기반 옵티마이저에 더 익숙해져 있다. 10g로 오면서 규칙기반 옵티마이저는 이제 지원하지 않겠다고 선언한 오라클 사의 정책과 비용기반 옵티마이저의 지속적인 발전을 지켜보면서 그 둘 간의 비교는 논쟁할 가치조차 없을 것으로 생각할 수도 있다. 그러나 실제 여러 고객사를 다녀보면 표면적으로 잘 드러나지 않을 뿐 그 둘 간의 비교 논쟁은 여전히 첨예한 것을 쉽게 느낄 수 있다. 일례로 몇 년 전 DB 성능 진단을 위해 어떤 고객사를 방문했는데, 오브젝트 통계정보를 전혀 생성하지 않은 채 오라클 9i를 운영하는 것을 보고 무척 당황했던 경험이 있다. 게다가 최근 차세대 시스템을 구축하는 회사에서조차 오라클 CBO가 불안하다는 이유로 통계정보를 생성하지 않고 RBO로 운영할 계획이라고 해서 DBA를 설득하느라 진땀을 빼기도 했다.
물론, DBA의 그런 주장을 이해 못 하는 바는 아니다. 잘 돌아가던 프로그램이 갑자기 성능 문제를 일으키고, 그 원인이 SQL 실행계획이 바뀌어서 그런 것이라고 판명나는 순간, 따가운 비난의 화살이 우선 DBA에게로 날아오기 마련이고, 다시 DBA는 그 책임을 오라클 CBO에 물을 수밖에 없을 것이다. 역자의 경우 2007년 1월 2일 첫 출근하던 날, 새로 추가된 파티션 통계 이상으로 벽두부터 고생했던 터라 그 심정을 잘 이해한다. 그 시스템이 오라클 10g였는데, 이번에 출시된 11g에서는 확실히 안심해도 된다고 누가 감히 얘기할 수 있겠는가? 이제 RBO는 공식적으로 그 개선이 중단되었기 때문에 새로운 오라클 DBMS를 도입하는 상황이라면 CBO는 피해 갈 수 없는 숙명과도 같은 존재가 돼 버렸다. 피할 수 없다면 즐기라고 했던가? 이제는 CBO에 좀더 친숙해 지려는 노력만이 유일한 대안이다. 진정한 튜닝 전문가는 스스로 튜닝을 잘하기 이전에 옵티마이저가 그 능력을 최대한 발휘할 수 있도록 환경을 조성해 주는 조력자가 돼야 한다. 어떤 쿼리는 어떤 힌트를 사용하면 문제를 즉시 해결할 수 있다는 식의 접근 방법보다는 당장 100점은 아닐지라도, 옵티마이저가 평균 90점 수준으로 문제를 해결할 수 있도록 우선 환경을 조성하고(예를 들어, 적합한 옵티마이저 모드 설정과 유효한 통계정보 생성 등), 부족한 10%는 필요에 따라 사용자가 채울 수 있도록 하는 전략이 필요하다. 그러기 위해서 튜닝 전문가뿐만 아니라 사용자와 DBA 모두가 옵티마이저의 비용 계산 원리를 이해해야 한다. 잘못된 실행계획이 자꾸 만들어 질 때, 옵티마이저가 왜 그런 어처구니 없는 결정을 하게 되었는지를 이해하려고 노력해야 한다. 사용자와 관리자 모두가 옵티마이저에 대해 깊은 이해가 있을 때, 쿼리를 수정하거나 힌트를 사용해야 하는지, 아니면 옵티마이저 환경 변수만 바꾸면 되는지? 또는 통계정보를 재생성해야 하는지? 통계정보를 왜, 어떻게 관리해야 할지? 등과 같은 이슈에 대해 오해 없는 적합한 솔루션을 찾아낼 수 있을 것이다. 다행히도 수준 높은 SQL 사용자, DBA, 튜닝 전문가가 되고자 노력하는 분들께 이 책은 아주 좋은 나침반이 돼 줄 것이다. 다른 어떤 서적이나 자료와 비교되지 않을 정도로 이 책은 오라클 비용기반 옵티마이저를 체계적이면서도 깊이 다루었는데, 이 책을 저술한 조나단 루이스(Jonathan Lewis)의 통찰력과 탐구력은 참으로 존경할 만하다. 게다가 기본적인 내용을 담은 이 책이 끝이 아니라 2권, 3권을 계속 준비 중이라고 하니 희소식이 아닐 수 없다. 그 방대하고 심오한 옵티마이저의 세계를 어떻게 이 책 한 권에 담을 수 있었겠는가? 계속 발간될 후속편은 더 큰 기대를 담아 본다. --- 역자일동 |