• 쿼리 변환 이란? • 휴리스틱(heristic) 쿼리 변환• 결과만 보장된다면 무조건 쿼리 변환 수행• 일종의 규칙기반(Rule-bases) 최적화 기법• 경험적으로 항상 더 나은 성능을 보일 것이라는 옵티마이저 개발팀의 판단 운영• 비용기반(Cost-based) 쿼리 변환• 변환된 쿼리의 비용이 더 납을 때만 활용• 낮지 않을 경우 원본 쿼리를 이용 최적화• 서브쿼리 Unnesting• Unnest의 사전적 의미• 상자를 차곡차곡 포개 넣다 --> 중첩의 의미• 서브 쿼리를 메인 쿼리와 같은 Level로 풀어 내는 것• 서브쿼리를 메인으로 풀면서 Join 방식의 적용이 가능 (서브쿼리의 경우 필터만 가능)• 중첩된 서브쿼리는 메인쿼리와 부모 자식이라는 종속적이고 계층적인 관계• 논리적인 관점에서 그 처리 과정은 IN,EXISTS를 불문하고 필터 방식• 필터 방식이 항상 최적의 수행 속도를 보장하지 못함• 옵티마이저는 아래 둘 중 하나를 선택
제4장 인덱스와 조인• 인덱스 스캔 효율• 인덱스 선행 컬럼이 등치[=] 조건이 아닐 때 발생하는 비효율• Sequential액세스(수평적 Scan) 효율은 선택도에 의해 결정 얼마나 적은 레코드를 읽었냐?• 리프 블록을 스캔하면서 읽은 레코드는 모두 필터링 되지 않고, 테이블 엑세스 비효율 0• 인덱스 컬럼 중 조건 절 생략 되거나, =조건이 아니라도 그것이 뒤쪽 컬럼일 때 비효율은 없다.ex)index: C1+C2+C3+C4where C1 = :awhere C1 = :a and C2=:bwhere C1 = :a and C2=:b and C3= :Cwhere C1 = :a and C2=:b and C3 between :C and :D• 수평적 SCAN에 문제가 없다• 선행 컬럼(아파트시세 코드)이 모두 = 조건, 일 때 필요한 범위만 스캔!• 뒤의 인터넷 매물이 between 조건 이어도 수평적 스캔 비효율이 없다.<중 략>• 인덱스 스캔 효율• B*Tree 인덱스• Unbalanced Index• B-tree의 B는 Balanced• B-tree 인덱스에서 Balance가 붕괴되는 현상은 발생하지 않음• Index Skew현상• 대량의 삭제 후 발생 현상• 빈 블록은 Free-list로 등록되지만 반환하지 않음(Index Rebuild 시 반환)• 재사용 가능하나, 다시 채워 질 때까지 인덱스 스캔 효율 저하• Index Sparse현상• 대량의 삭제 작업 후 발생• 인덱스의 밀도가 낮은 상황• Skew 현상과 같이 완전히 빈 블록은 재사용 되지만, Empty Block이 거의 없어 데이터가 채워 질 때까지 인덱스 비효율 발생• 총 레코드 건수가 일정 한데도 인덱스 공간 사용량 지속 증가가 발생• 인덱스 재생성(재 생성 요건)• 인덱스 분할에 의한 경합이 현저히 높을 때
1. 인덱스 구조1.1 인덱스 탐색1) 수직적 탐색- roo brench leaf- 읽고자 하는 시작점 검색- Random I/O2) 수평적 탐색- leaf block의 시작점부터 종료점 까지- sequential I/O1-2 인덱스 기본 원리1.2.1 인덱스 사용이 불가능 하거나 범위스캔(Range Scan)이 불가능한 경우1) 인덱스 컬럼의 가공 (좌변가공)인덱스 사용 및 범위스캔 불가능/인덱스 및 범위스캔 가능으로 변환select *from emp_twhere substr(ename, 1, 2) = 'CL';select *from emp_twhere ename like '대한%';<중 략>3. 오라클 DBMS 구조3-1 오라클 DBMS 구조 구분1) instance1-1) SGA• Shared pool• Library cache- 실행계획 저장• Dictionary cache- 통계정보, 메타데이터• Data buffer cache- 데이터를 읽기 위한 블록 적재• Redo log buffer- 로그파일에 쓰기 위한 DB 변경사항에 대한 모든 문장을 저장1-2) background process1-2-1) pmon- 프로세스 관리, 생성 및 좀비 프로세스 삭제1-2-2) smon- 인스턴스 리커버리1-2-3) dbwr- Data buffer cache의 내용을 data file에 쓰는 역할1-2-4) lgwr- Redo log buffer에 저장된 내용을 redo log file에 기록하는 역할1-2-5) ckpt- SGA의 변경된 데이터베이스 버퍼 캐시와 리두 로그 버퍼의 내용이 데이터베이스에 저장 되도록 DBWR와 LGWR를 호출하는 이벤트 기능과 다른 하나는 체크 포인트가 발생시 각 데이터 파일의 헤더 부분에 체크포인트 이벤트의 현재 시점을 그리고 컨트롤 파일에는 발생된 체크포인트 이벤트의 정보를 기록하는 체크포인트 프로세스이다.