반응형
논리적 인덱스의 종류
- BITMAP INDEX
- B-TREE INDEX
B-TREE INDEX
- 우리가 흔히 아는 -TREE 구조로 이루어진 인덱스
- ROOT, BRANCH, LEAF 구조로 이루어져 있음
BITMAP INDEX
- 생성부분에서 B-TREE와 비슷하지만, Bitmap이라는 형식으로 압축저장하기때문에 중복값이 많을경우에 효과적으로 저장 가능
- Bitmap인덱스는 Online Rebuild작업을 지원하지 않음
Root 블록
- 가장 상위이자 가장먼저 액세스 하는 블록
- ROOT 블록을 액세
Branch 블록
- Root와 Leaf 사이에 위치
Leaf 블록
- 인덱스 key 컬럼 값과 해당 테이블의 로우 위치(rowid)가 저장되어 있음
인덱스 엔트리 구조
- 인덱스 엔트리 헤더 : 컬럼번호와 lock 정보 포함
- 인덱스 키 컬럼 길이
- 인덱스 키 컬럼 값
- ROWID : 테이블에서의 row 위치 정보
ROWID 제공 정보
- 오브젝트 번호
- 데이터파일 번호
- 블록번호
- ROW 번호
INSERT 실행시
- 만약 값이 블록 마지막에 입력되고, PCTFREE값이 채워지지 않으면 그대로 입력되지만 아니라면 새로운 블록 사용 시작
- 만약 중간에 값이 채워지게 된다면 분할 시작 -> 이때 분할을 적절히 함으로써 블록들의 공간을 남기게 되는데, 남기는 이유는 값이 더 채워질수도 있기 때문이다.
DELETE UPDATE 실행시
- 원본테이블에서 값이 삭제되어도 인덱스에서는 삭제작업을 하지않고 삭제되었다는 표시만 해준다
- UPDATE는 인덱스에서는 사용하지 않는 개념이다. -> 삭제하고 INSERT 하는 방식으로 진행
primary key 생성 후 unique key 자동 생성
SQL> ALTER TABLE DAMIN.STUDENT ADD CONSTRAINT IDX_STUDNO PRIMARY KEY(STUDNO);
자동으로 인덱스 타는거 확인 가능
SQL> set autotrace on
SQL> select * from damin.student where studno=9715;
STUDNO NAME ID GRADE JUMIN BIRTHDAY TEL HEIGHT WEIGHT DEPTNO1 DEPTNO2 PROFNO
---------- ---------- -------------------- ---------- ------------- ------------------ --------------- ---------- ---------- ---------- ---------- ----------
9715 허우 wooya2702 1 7802232116784 23-FEB-78 02)6122-2345 163 51 103
Execution Plan
----------------------------------------------------------
Plan hash value: 3262245179
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 76 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| STUDENT | 1 | 76 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | SYS_C007658 | 1 | | 0 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
일반적인 인덱스를 생성하면 index range scan을 하는데 unique인덱스일 경우 훨씬 효과적임
SQL> CREATE INDEX IDX_GRADE ON DAMIN.STUDENT(GRADE);
SQL> SET AUTOTRACE ON
SQL> SELECT * FROM DAMIN.STUDENT WHERE GRADE='4';
STUDNO NAME ID GRADE JUMIN BIRTHDAY TEL HEIGHT WEIGHT DEPTNO1 DEPTNO2 PROFNO
---------- ---------- -------------------- ---------- ------------- ------------------ --------------- ---------- ---------- ---------- ---------- ----------
9411 서진수 75true 4 7510231901813 23-OCT-75 055)381-2158 180 72 101 201 1001
9412 서재수 pooh94 4 7502241128467 24-FEB-75 051)426-1700 172 64 102 2001
9413 이미경 angel000 4 7506152123648 15-JUN-75 053)266-8947 168 52 103 203 3002
9414 김재수 gunmandu 4 7512251063421 25-DEC-75 02)6255-9875 177 83 201 4001
9415 박동호 pincle1 4 7503031639826 03-MAR-75 031)740-6388 182 70 202 4003
Execution Plan
----------------------------------------------------------
Plan hash value: 2474209842
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 380 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| STUDENT | 5 | 380 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_GRADE | 5 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("GRADE"=4)
DROP 시에는 스키마명을 붙이지 않음
DROP INDEX IDX_GRADE;
인덱스 REBUILD
- 인덱스 REBUILD 시에는 정렬작업이 발생하지 않음 > 속도가 빠르다
- 그 이전에 존재하던 인덱스는 제거 > 먼저 재생성되고 제거되기때문에 테이블스페이스에는 인덱스 두개의 용량만큼의 공간이 있어야 함
- 인덱스가 재생성되는 동안 기존에 존재하는 인덱스를 사용
인덱스를 재생성하는 이유
- 기존에 DELETE나 UPDATE 문이 많이 사용됐을경우 낭비되는 공간이 많아져서 해주어야 함
- 인덱스를 다른 테이블스페이스로 옮겨주는 경우
SQL> SELECT * FROM DBA_TABLESPACES;
SQL> SELECT * FROM DBA_INDEXES
WHERE OWNER='DAMIN'
AND TABLE_NAME='STUDENT';
SQL> ALTER INDEX DAMIN.SYS_C007659 REBUILD tablespace DAMIN_IDX_TS;
SQL> ALTER INDEX DAMIN.SYS_C007658 REBUILD tablespace DAMIN_IDX_TS;
SQL> SELECT INDEX_NAME, TABLESPACE_NAME, STATUS from dba_indexes where owner='DAMIN' AND TABLE_NAME='STUDENT';
INDEX_NAME TABLESPACE_NAME STATUS
-------------------------------------------------------------------------------------------------------------------------------- ------------------------------ --------
SYS_C007658 DAMIN_IDX_TS VALID
SYS_C007659 DAMIN_IDX_TS VALID
SQL>
ALTER INDEX DAMIN.SYS_C007658 ONLINE;
- 온라인 재생성의 경우 공간을 제거할 수 없음
- 또, 테이블 LOCK이 걸리므로 DML이나 DDL이 많은 경우 조심해야 함
따라서 블록들을 모아줄 경우에는 Coalescing 사용
ALTER INDEX DAMIN.SYS_C007658 COALESCE;
인덱스 공간 활용 확인
반응형
'ORACLE > Oracle_SQL' 카테고리의 다른 글
패키지(PACKAGE) / 프로시저(PROCEDURE) / 함수(FUNCTION) (0) | 2023.07.16 |
---|---|
인덱스 관련 쿼리 정리 (0) | 2023.07.02 |
시스템 권한부여 (ANY) (0) | 2023.06.25 |
인덱스 생성 속도 향상 (NOLOGGING, PARALLEL) (0) | 2023.06.24 |
시스템 권한 | WITH GRANT/ADMIN OPTION (0) | 2023.06.09 |