인덱스 는 큰 테이블에서 소량 데이터 검색시 사용한다.
제목 | 설명 |
---|---|
수직적 탐색 | 인덱스 스캔 '시작지점'을 찾는 과정 |
수평적 탐색 | 데이터를 찾는 과정 |
-> ex) 생년월일 컬럼이 인덱스컬럼이라 할지라도,
where SUBSTR(생년월일)='05'
이런식으로 있으면 인덱스 못탐
(함수, like, or 등 )
-> ex) idx1 = [종목코드, 종목명] 으로 인덱스 구성되어있다고 할때,
where 종목명='야구' 이런식이면
종목코드-종목명 순으로 인덱스순서가 배치되어있을거니까
같은 종목명이라고 해도 여러 리프블록에 띄엄띄엄 배치되어있을 가능성 있어서 range scan은 못함
B는 Balanced 의 약자로, 어떤 값을 탐색하더라도 인덱스 루트블록- 인덱스 리프블록에 도달하기까지 읽는 블록수가 같다는 뜻 !
WHERE 전화번호 := tel_no OR 고객명 := cust_no
에 대해
옵티마이저가 아래와 같이 변환하여 수행 CONCATENATION
select * from where 전화번호 := tel_no
UNION ALL
select * from where 고객명 := cust_no
~~~~~
in list 갯수만큼 옵티마이저가 index range scan 반복한다
where 종목 in ('야구','축구')
select * from A where 종목='야구'
UNION ALL
select * from A where 종목='축구'
ex) 인덱스가 [소속팀,사원명,연령] 이런식으로 구성되어있다 한다면
이 결합인덱스는
1. 소속팀 순으로 정렬
2. 소속팀이 같으면 사원명 순으로 정렬
3. 사원명이 같으면 연령순으로 정렬
이 순서로 정렬될 것이다.
-> 코딩을 할때 컬럼과 검색할 값의 데이터 타입을 맞추는 습관을 들이자!
ex) 생년월일 컬럼이 문자형이고, 아래와 같이 쓴다면
where 생년월일 = 19960101
옵티마이저는 자체적으로 where TO_NUMBER(생년월일)=19960101
로 인덱스 컬럼을 가공하기때문에 인덱스를 타지 않는다 ! -> 성능 안좋아질 수 있음
'=' 조건일때는 아래와 같다
숫자형 > 문자형
-> 숫자형이 힘이 더 세서 문자형에 자동으로 TO_NUMBER 적용됨
날짜형 > 문자형
-> 날짜형이 힘이 더 세서 문자형에 자동으로 TO_DATE 적용됨
'LIKE' 조건일때는 아래와 같다.
숫자형 < 문자형
숫자형 컬럼을 like 조건으로 검색 시 자동 형변환 발생 TO_CHAR 적용됨