01 인덱스 구조
인덱스 리프블록
- 모든 컬럼 NULL허용일 때
- 복합컬럼 중 하나라도 NOT NULL값을 갖으면 그 레코드는 인덱스레코드로 존재함
- 복합컬럼 모두 NULL이라면 인덱스레코드 없음
- 하나라도 NOT NULL제약이 있을 때
- 모든 테이블레코드에 1:1 대응하는 인덱스레코드가 존재함
인덱스 브랜치블록
- 인덱스 구성컬럼의 값이 변경된다고 해도 상위에 있는 브랜치블록의 값이 변경되진 않음
- 레코드의 삭제, 추가로 인한 SPLIT이 발생할 때만 블랜치블록의 값이 변경됨
02 인덱스 기본원리
인덱스 Range Scan이 불가능
- 인덱스컬럼 가공 (좌측가공)
- 인덱스컬럼 부정형 비교
- 묵시적 형변환 (p.35)
- 형변환 우선순위 (문자형 < 날짜형 < 숫자형) (단,
like 비교연산은 ‘문자열’에 특화된 연산이므로 문자형이 우선순위가 높다)
인덱스 아예 사용불가 즉, Table Full Scan
- 인덱스 구성컬럼이 모두 Null 허용이며 모든 구성컬럼이 조건절로 IS NULL 일 경우
- 인덱스레코드만으로 결과집합을 만들 수 없기 떄문
인덱스를 사용하게 끔 만드는 편법 : FBI
안티패턴 (p.35)
날짜형식의 데이터를 DATE가 아닌 VARCHAR2로 편법을 쓸 때
- 부작용이 발생함 (묵시적형변환)
- 위 편법이 어쩔 수 없는 상황에서 사용된다면?
substr(일자형문자열, start, end) , , + 연산 을 하지말것
- 대신,
TO_DATE(일자형문자열, 'yyyymmdd', -1) , ADD_MONTHS(DATE, -1) 을 사용하자