머리말 ... 16 용어 대역표 ... 19 제1장 애플리케이션 구축을 위한 올바른 접근법 중요한 것은 팀 노력이다 ... 38 DBA와 개발자 역할 ... 40 문서를 읽어라 ... 44 가이드에 대한 안내 ... 44 독서 로드 맵 ... 48 블랙박스 증후군을 피하라 ... 50 데이터베이스 독립 대 데이터베이스 종속 ... 51 블랙박스 증후군의 위험 ... 52 이것은 데이터베이스이지, 데이터 더미가 아니다 ... 66 기본 키와 외래 키를 사용하라 ... 66 참조 무결성의 오버헤드를 테스트하라 ... 67 중간 계층의 검사가 만병 통치약은 아니다 ... 70 테스트 환경을 구축하라 ... 74 대표 데이터로 테스트하라 ... 75 단일 사용자 환경에서 테스트하지 말라 ... 75 먼지가 없는 연구실에서 테스트하지 말라 ... 80 성능 향상을 위해서는 튜닝하지 말고 디자인하라 ... 81 일반적인 데이터 모델을 사용하지 말라 ... 81 효율성을 염두에 두고 데이터 모델을 디자인하라 ... 85 처음부터 성능 목표를 정의하라 ... 89 구체적이고 명확한 메트릭에 따라 작업하라 ... 91 장기간에 걸쳐 메트릭을 수집하고 기록하라 ... 91 '모두가 내 임무로 알고 있다'는 이유 때문에 그래서는 안 된다 ... 92 벤치마크, 벤치마크, 벤치마크 ... 94 소규모 벤치마킹 ... 95 대규모 벤치마킹 ... 99 시스템에 코드를 삽입하라 ... 102 asktom.oracle.com에 나타난 추적 ... 103 원격 디버깅을 위한 코드 삽입 ... 105 아무 곳에나 DBMS_APPLICATION_INFO를 사용하라 ... 106 PL/SQL에 DEBUG.F를 사용하라 ... 108 애플리케이션에 SQL_TRACE를 사용하라 ... 109 산업 표준 API를 사용하라 ... 111 자신만의 루틴을 작성하라 ... 112 감사는 욕이 아니다 ... 112 권위에 도전하라 ... 113 보편적인 최선책을 조심하라 ... 114 비율과 기타 신화를 의심하라 ... 115 지름길을 찾지 말라 ... 118 단순화하라 ... 120 대안을 고려하라 ... 120 데이터베이스가 최선을 다하도록 내버려두자 ... 122 제공된 기능을 사용하라 ... 125 기능 X가 느리다고 들었다 ... 126 기능 X가 복잡하다는 얘기를 들었다 ... 129 하고 싶지 않다 ... 130 몰랐다 ... 132 데이터베이스 독립이 필요하다 ... 132 요약 ... 135 제2장 성능 틀키트 SQL*Plus ... 139 SQL*Plus 설치 ... 140 SQL*Plus 환경의 정의 ... 141 문서를 읽자 ... 144 EXPLAIN PLAN ... 144 EXPLAIN PLAN 설치 ... 144 EXPLAIN PLAN을 사용하라 ... 146 쿼리 계획을 읽는 방법 ... 148 EXPLAIN PLAN의 함정 회피 ... 152 DBMS_XPLAN과 V$SQL_PLAN의 사용 ... 156 AUTOTRACE ... 158 AUTOTRACE 설치 ... 159 AUTOTRACE 사용 ... 159 AUTOTRACE의 출력.포맷 바꾸기 ... 160 AUTOTRACE 출력 이해하기 ... 162 AUTOTRACE 출력에서 무엇을 찾고 있는가? ... 164 TKPROF ... 192 TKPROF 활성화 ... 193 TKPROF 실행 ... 194 TKPROF 보고서 읽기 ... 196 대중을 위한 TKPROF ... 202 Runstats ... 210 Runstats 설치 ... 211 Runstats 사용 ... 216 Statspack ... 221 Statspack 설치 ... 221 Statspack 사용 ... 223 Statspack의 오용 ... 224 한눈에 보는 Statspack ... 225 DBMS_PROFILER ... 232 프로파일러를 사용하고자 하는 이유 ... 232 프로파일러 리소스 ... 235 JDeveloper(그리고 디버깅) ... 236 요약 ... 240 제3장 아키텍처와 관련된 결정 공유 서버 대 전용 서버 연결에 대한 이해 ... 242 전용 서버 연결은 어떻게 동작하는가? ... 243 공유 서버 연결은 어떻게 동작하는가? ... 246 공유 서버 연결에 대한 일반적인 오해 ... 250 전용 서버 대 공유 서버 요약 ... 252 클러스터링 이용 ... 253 RAC는 어떻게 동작하는가? ... 254 RAC의 이점은 무엇인가? ... 260 클러스터링 요약 ... 261 파티셔닝 이용 시기 ... 262 파티셔닝 개념 ... 263 파티셔닝 신화 ... 265 왜 파티셔닝을 사용하는가? ... 271 파티셔닝 요약 ... 274 병렬 작업을 사용할 시기 알기 ... 275 병렬 신화 ... 276 병렬 관리 ... 280 병렬 쿼리 ... 282 병렬 DML ... 285 DIY 병렬 처리 ... 286 병렬 처리 요약 ... 289 요약 ... 290 제4장 효과적인 관리 SPFILE을 이용하여 데이터베이스 시작하기 ... 292 PFILE의 문제점 ... 292 SPFILE의 동작 방법 ... 293 SPFILE을 사용하도록 데이터베이스 바꾸기 ... 294 시스템 매개변수의 변경 내용 저장하기 ... 295 PFILE은 진부한가? ... 295 도와 주세요, 제 SPFILE이 손상되어 시작할 수 없습니다 ... 296 SPFILE 요약 ... 299 데이터 파일의 관리를 오라클에 맡기기 ... 300 언제 OMF가 유용한가? ... 301 OMF의 동작 방법 ... 302 OMF 요약 ... 304 복구의 방탄화 ... 305 백업 지침 ... 306 백업과 복구 요약 ... 310 지역적으로 관리되는 테이블 영역 사용하기 ... 311 왜 DMT가 진부한가? ... 312 객체가 얼마나 커질지 모르는 상황에서는 시스템에 의해 관리되는 LMT를 사용하라 ... 313 객체의 궁극적인 크기를 알고 있는 경우에는 획일적인 익스텐트 크기를 사용하라 ... 316 LMT에 관한 몇 가지 주의사항 ... 318 LMT와 DMT 요약 ... 324 세그먼트 공간 관리를 오라클에 맡기라 ... 325 사용 가능 목록과 사용 가능 목록 그룹에 대안 이해 ... 325 PCTFREE와 PCTUSED가 사용 가능 목록을 제어하는 방법 ... 331 ASSM의 경우 ... 333 ASSM 요약 ... 336 롤백 세그먼트 관리를 오라클에 맡기라 ... 336 UNDO_RETENTION 설정 ... 337 UNDO 테이블 영역에 대한 주의사항 ... 340 UNDO 테이블 영역 요약 ... 342 요약 ... 342 제5장 문 처리 SQL 문의 유형에 대한 이해 ... 346 문은 어떻게 실행되는가? ... 347 파싱 ... 347 최적화와 행-원본 생성 ... 355 실행 ... 357 문 실행 요약 ... 359 쿼리의 시작과 끝 ... 360 신속히 반환하는 쿼리 ... 360 늦게 반환하는 쿼리 ... 362 일관된 읽기 ... 365 수정 DML의 시작과 끝 ... 369 DDL 처리 ... 371 바인드 변수의 사용 ... 373 바인드 변수를 사용하면 무엇이 좋은가? ... 375 자바와 VB에서 바인드 변수 사용하기 ... 386 모든 규칙에는 예외가 있다 ... 392 바인드 변수 조사 ... 397 가능한 한 적게 파싱하기 ... 402 파싱 비용 ... 403 PL/SQL을 사용한 파스 줄이기 ... 407 트리거로부터 SQL을 옮겨 파싱 줄이기 ... 416 한 번의 파스와 여러 번의 실행 ... 420 요악 ... 421 제6장 비용 기반의 최적화기 활용 극대화 RBO가 사장된 이유 ... 425 CBO로 하여금 최선을 다 하도록 만들기 ... 428 OPTIMIZER_INDEX_CACHING과 OPTIMIZER_INDEX_COST_ADJ 매개변수 조정하기 ... 428 시스템 통계의 사용 ... 433 CBO 최적화하기 ... 444 업그레이드에 COMPATIBLE 설정하기 ... 444 전체 스캔의 비용을 줄이기 위하여 DB_FILE_MULTIBLOCK_READ_COUNT 설정하기 ... 445 HASH_JOIN_ENABLED를 설정하여 해시 조인 제어하기 ... 450 OPTIMIZER_DYNAMIC_SAMPLING을 설정하여 동적으로 통계 수집하기 ... 451 OPTIMIZER_FEATURES_ENABLE을 설정하여 기능 선택하기 ... 459 OPTIMIZER_MAX_PERMUTATIONS를 설정하여 순열 제어하기 ... 462 OPTIMIZER_MODE를 설정하여 모드 선택하기 ... 465 QUERY_REWRITE_ENABLED와 QUERY_REWRITE_INTEGRITY를 이용하여 쿼리 다시쓰기 ... 478 BITMAP_MERGE_AREA_SIZE, SORT_AREA_SIZE, 그리고 HASH_AREA_SIZE를 이용하여 PGA 메모리 제어하기 ... 486 스타 쿼리를 위해 STAR_TRANSFORMATION_ENABLED 사용하기 ... 491 최적화기에 영향을 미치는 기타 매개변수 설정하기 ... 492 10053 이벤트를 사용하여 CBO 선택 추적하기 ... 493 요약 ... 499 제7장 효과적인 스키마 디자인 스키마 디자인 기본 원칙 ... 502 데이터베이스에 데이터 무결성 시행 맡기기 ... 502 올바른 데이터 유형을 사용하라 ... 510 가장 빈번하게 요청되는 질문을 최적화하라 ... 515 테이블 종류 개요 ... 518 B*트리 인덱스 클러스터 테이블 ... 519 클러스터 생성하기 ... 521 클러스터 사용하기 ... 525 클러스터 요약 ... 539 인덱스 조직 테이블(IOT) ... 539 IOT를 연관 테이블에 대한 공간 절약 대안으로 사용하기 ... 540 IOT를 사용하여 무작위로 삽입되는 데이터를 한데 모으기 ... 542 IOT 요약 ... 546 외부 테이블 ... 547 외부 테이블 설정 ... 548 외부 테이블 수정하기 ... 552 직접 경로 적재에 외부 테이블 사용하기 ... 552 병렬 직접 경로 적재에 외부 테이블 사용하기 ... 555 병합에 외부 테이블 사용하기 ... 555 외부 테이블의 오류 처리하기 ... 557 인덱싱 테크닉 ... 559 FBI 사용하기 - 고정관념을 버려라 ... 560 도메인 인덱스 사용하기 ... 568 압축 ... 572 인덱스 키 압축 ... 573 읽기 전용/준읽기 전용 테이블에 테이블 압축 사용하기 ... 581 압축 요약 ... 593 요약 ... 593 제8장 효과적인 SQL 효율적인 SQL을 작성하는 데 필요한 것 ... 597 액세스 경로 이해하기 ... 598 전체 스캔 ... 598 ROWID 액세스 ... 607 인덱스 스캔 ... 609 클러스터 스캔 ... 620 조인에 대한 이해 ... 620 중첩된 루프 ... 621 해시 조인 ... 624 정렬 병합 조인 ... 628 데카르트 조인 ... 631 반 조인 ... 634 전체 외부 조인 ... 640 (물리적인) 스키마 문제 ... 643 SQL 바로 알기 ... 647 ROWNUM 유사 열 ... 650 스칼라 하위 쿼리 ... 668 해석 함수 ... 680 쿼리를 튜닝하지 말라 ... 705 질문 이해하기 ... 705 개념 증명 예 ... 707 기타 SQL 테크닉 개요 ... 711 요약 ... 712 제9장 효과적인 PL/SQL 프로그래밍 왜 PL/SQL인가? ... 716 PL/SQL은 가장 효율적인 데이터 조작 언어이다 ... 717 PL/SQL은 이식 및 재사용이 가능하다 ... 719 가능한 한 적게 작성하라 ... 721 절차적으로 수행하지 않기 ... 725 화면에 코드를 맞춰라 ... 727 패키지를 사용하라 ... 727 패키지의 이점 ... 727 종속성 체인 끊기 ... 728 패키지 요약 ... 735 정적 SQL을 사용하라 ... 735 정적 SQL의 이점 ... 735 동적 SQL을 대체할 기회를 찾아라 ... 736 정적 SQL 요약 ... 739 대량 처리 ... 740 효과가 클 때는 대량 처리를 사용하라 ... 740 ETL 작업에 대량 처리를 사용하라 ... 743 대량 처리 요약 ... 750 데이터 반환하기 ... 750 참조 커서의 이점 ... 750 참조 커서를 이용하여 결과 집합을 반환하라 ... 751 %TYPE과 %ROWTYPE을 사용하라 ... 757 레코드 유형의 기반을 테이블에 두기 ... 758 레코드 유형의 기반을 커서에 두기 ... 761 데이터 유형의 기반을 열에 두기 ... 765 호출자 권한 이용하기 ... 767 호출자 권한과 다중 스키마 ... 768 호출자 권한 루틴의 조건 ... 769 조회 작업을 효율적으로 수행하라 ... 771 조회를 위한 단일 행 인출 ... 774 조회를 위한 대량 처리 ... 777 조회를 위한 단일 문 작업 ... 780 조회 요약 ... 781 자치 트랜잭션을 사용할 때 주의하기 ... 782 자치 트랜잭션의 조건 ... 782 자치 트랜잭션은 데이터 무결성에 영향을 끼칠 수 있다 ... 783 암시적 혹은 명시적 커서를 사용할지 선택하라 ... 786 단일 행 선택을 위해 암시적 커서 사용하기 ... 786 제한된 수의 행을 가진 결과 집합에 암시적 커서 사용하기 ... 794 암시적/명시적 커서 요약 ... 796 요약 ... 796 제10장 그렇게 사고를 만났다 무엇이 다른지를 찾는다 ... 800 오늘부터 내력을 수집하라 ... 804 탐정 작업 ... 805 한 번에 한 가지만 변경한다 ... 807 이 한 가지를 변경하는 데는 충분한 근거가 있어야 한다 ... 808 목표를 설정하라 ... 809 가설을 검증하라 ... 809 변화를 되돌릴 수 있어야 한다 ... 812 테스트 사례를 작성한다 ... 813 테스트 사례 요구 사항 ... 814 가능한 한 테스트 사례를 작게 유지하라 ... 814 요약 ... 817 부록 : 설치와 몇 가지 스크립트 BIG_TABLE 설정하기 ... 820 자주 사용되는 스크립트 ... 822 PRINT_TABLE ... 823 SHOW_SPACE ... 826 COLS_AS_ROWS ... 831 GEN_DATA ... 840 찾아보기 ... 843