Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- date_format
- 스테이지에 올리기
- JSONArray 분할
- 날짜형을 문자형으로
- jar 소스보기
- 성능개선
- ChainedTransactionManager #분산데이터베이스 #Spring Boot #MyBatis
- 마이바티스 트랜잭션
- spring webflux
- JobExecutionAlreadyRunningException
- spring reactive programming
- JSONObject 분할
- JSON 분해
- 무시하기
- nonblocking
- git stage
- multi update
- 스프링 웹플럭스
- 마리아디비
- 폐기하기
- 스프링 리액티브 프로그래밍
- 스프링 배치 메타 테이블
- Meta Table
- batchInsert
- JSON 분리
- str_to_date
- org.json
- 스프링 배치 공식문서
- JSON 분할
- 문자형을 날짜형으로
Archives
- Today
- Total
ebson
오라클 INDEX 본문
1. INDEX의 개념
- 책에서 목차나 색인의 역할을 함
- ROWID(file번호 + block번호 + row번호를 통해 data block에 접근함
- 데이터를 찾기 위해 오름차순으로 정렬된 주소체계임
- 테이블에 대한 검색 속도를 높여주는 자료구조임
- ROOT, BRANCH, LEAF로 구성된 계층적 구조임
- 오라클 서버에서 옵티마이저는 FULL SCAN보다 INDEX SCAN이 유리하다고 판단되면 생성된 INDEX의 ROOT부터 찾음
- ROOT에는 BRANCH 블럭의 시작점에 대한 정보를, BRANCH LEVEL에서는 LEAF블럭의 시작점에 대한 정보를 갖고 있음
- LEAF에서 해당 데이터의 ROWID를 알 수 있음
- 트리 구조를 따라 검색해 ROWID를 알아냄으로써 빠르게 데이터에 접근함
- INDEX에는 NULL값이 들어갈 수 없음
- INDEX 테이블은 정렬되어 있고 데이터 수정 시 재정렬됨
- WHERE 컬럼명 LIKE ‘A%’에서는 유효하지만, LIKE ‘%A’ 또는 ‘%A%’에서는 무효함
- 인덱스 컬럼를 변경해 사용하면 인덱스를 타지 않음. 예를 들어, 인덱스로 잡힌 날짜 컬럼을 TO_CHAR(날짜컬럼)으로 변경해 검색하면 인덱스를 타지 않음.
2. INDEX 사용이유
- 검색속도 향상을 위함
- FULL SCAN에서 모든 테이블의 데이터를 읽어오는 방법과는 다르게 ROOT-BRANCH-LEAF-DATA BLOCK의 총 4번의 IO를 통해 접근함
- 구별되는 값이 많은 컬럼에서 사용함. 기본키는 UNIQUE INDEX를 생성함. 검색하려는 모든 데이터가 고유한 값이면 INDEX구조에서 중복이 없음
- WHERE절에서 자주 조회되는 칼럼을 사용함. 중복 데이터가 있더라도 자주 조건절에 사용되는 컬럼이라면 INDEX SCAN이 효율적임
- 큰 테이블에서 적은 데이터가 필요할 때 사용함. 그래서 비율을 가장 많이 차지하는 데이터를 NULL로 INSERT하고 나머지 데이터를 구분 후 INDEX를 생성하면, NULL을 제외한 데이터 ROW들에 대해서만 INDEX SCAN을 할 수 있음. 예를들어, 100건 중 95건을 NULL로, 나머지 5건을 각각 구분하면, FULL SCAN시에는 100건을 탐색하지만 INDEX SCAN에서는 5건만 탐색함
- ORDER BY 절에서 이미 정렬된 데이터를 가져옴으로써 부하를 줄일 수 있음
- 정렬된 데이터를 대상으로 함으로써 MIN, MAX 작업의 부하를 줄일 수 있음
3. INDEX 사용시 장단점
3.1. 장점
- 데이터 양이 많아져도 속도차이가 많이 안남
- SELECT 구문에서는 보통 속도 향상의 장점이 있음
3.2. 단점
- 꼭 INDEX SCAN이 유리하지는 않음. 예를 들어, 데이터가 1건인 경우에는 FULL SCAN이 유리함
- INDEX SCAN은 IO단위가 1블럭임. 그래서 DB_FILE_MULTIBLOCK_READ_COUNT 설정에 따라 한번에 여러 블럭을 읽는 것이 INDEX SCAN보다 효율적일 수 있음
- INDEX를 생성하기 위해서 별도의 저장공간이 필요함
- INSERT, UPDATE, DELETE 작업 시, 오름차순 정렬된 INDEX에 대한 추가 작업이 필요함
4. INDEX 사용 방법
4.1. INDEX 생성
- INDEX는 조건절에 자주 등장하는 컬럼,항상 ‘=’ 으로 비교되는 컬럼, 중복되는 데이터가 최소한인 컬럼, ORDER BY 절에서 자주 사용되는 컬럼, 조인 조건으로 자주 사용되는 컬럼을 생성하는 것이 권장이 됨
- CREATE INDEX [인덱스명] ON [테이블명](컬럼1, 컬럼2, … )
- CREATE UNIQUE INDEX -> 컬럼 중복 없는 INDEX 생성
4.2. INDEX 조회
- SELECT * FROM USER_INDEXES WHERE TABLE_NAME = [테이블명]
- SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = [테이블명]
4.3. INDEX 수정
- DROP INDEX [기존 인텍스 명] TO [바뀔 인덱스 명]
- ALTER INDEX [기존 인덱스 명] RENAME TO [바뀔 인덱스 명]
- 오라클에서는 인덱스의 구성 컬럼을 추가하는 ALTER문이 불가함. DROP 후에 새로 CREATE 해주어야 함
4.4. INDEX 삭제
- DROP INDEX [인덱스 명]
- 조회성능을 극대화하기 위한 객체이므로 너무 많이 만들면 INSERT, UPDATE, DELETE시에 부하가 발샘함. 안쓰는 INDEX는 삭제하는 것이 권장됨
4.5. INDEX 리빌드
- 삽입, 수정, 삭제 등이 오랫동안 일어나면 트리 한쪽이 무거워지고 전체적으로 트리의 깊이가 깊어져 검색속도가 하락함. 그래서 주기적인 리빌딩 작업이 권장됨
- INDEX 트리의 깊이가 4 이상인 INDEX가 주로 리빌딩 대상이 됨
- 깊이가 4 이상인 INDEX를 조회하는 쿼리
=> SELECT I.TABLESPACE_NAME,I.TABLE_NAME,I.INDEX_NAME, I.BLEVEL, DECODE(SIGN(NVL(I.BLEVEL,99)-3),1,DECODE(NVL(I.BLEVEL,99),99,'?','Rebuild'),'Check') CNF
FROM USER_INDEXES I
WHERE I.BLEVEL > 4
ORDER BY I.BLEVEL DESC
- 인덱스 리빌드
=> ALTER INDEX [인덱스명] REBUILD;
참고 출처
https://myjamong.tistory.com/184
https://coding-factory.tistory.com/419
https://coding-factory.tistory.com/746
'DATABASE STUDY' 카테고리의 다른 글
오라클 CHAR, VARCHAR2의 차이 (0) | 2022.08.28 |
---|---|
오라클 DEFAULT (0) | 2022.08.28 |
오라클 NULL (0) | 2022.08.28 |
오라클 SEQUENCE (0) | 2022.08.28 |
오라클 PL/SQL옵티마이저 (0) | 2022.08.28 |
Comments