11. ORACLE OBJECT INDEX
2024. 4. 1. 09:01ㆍ데이터베이스
INDEX란?
SQL명령문의 처리 속도를 향상시키기 위해서 컬럼 생성하는 것
장점: 검색 속도가 빨라짐(SELECT 문 향상)
단점: 인덱스 위한 추가 저장 공간이 필요
데이터의 변경 작업(INSERT/UPDATE/DELETE)이 자주 일어날 경우 성능 저하
*검색과 데이터 변경 작업속도는 반비례
*INDEX로 지정된 컬럼으로 검색했을 때 그 검색 결과가 전체 튜플의 10~15% 미만일 때 효과 굿
SELECT * FROM EMP WHERE DEPTNO > 20;
-- DEPTNO 에 INDEX 걸려있고 EMP TABLE 의 튜플 개수가 100라면
--SELECT 문 결과가 15개 미만 정도 나올 때 효과적
INDEX 표현식
CREATE [UNIQUE] INDEX 인덱스 명 ON 테이블 명
(컬럼 명, 컬럼 명 | 함수 명, 함수 계산식);
INDEX 구조
INDEX 종류
- 고유 인덱스
- 중복값 있을 수 X
- PK 생성하면 자동으로 생성
CREATE UNIQUE INDEX IDX_T12 ON T12(C1);
INSERT INTO T12 VALUES('1234567가', '가나다라마', '1234567가', '가나다라마');
--C1 에다가 중복되는 값을 INSERT 할 수 없음
--ORA-00001: 무결성 제약 조건(SCOTT.IDX_T12)에 위배됩니다
* UNIQUE INDEX는 중복 값이 있는 컬럼에 생성 시 에러 발생
ex. DEPT_CODE 는 여러명의 사람이 가지고 있어서 중복값 있음
- 비고유 인덱스
CREATE INDEX IDX_DEPTCODE
ON EMPLOYEE(DEPT_CODE);
- 단일 인덱스 : 한개의 컬럼으로 구성된 인덱스
- 위에 2개가 단일 인덱스 - 결합 인덱스(COMPOSITE INDEX) : 2개 이상의 칼럼으로 구성한 인덱스
CREATE INDEX IDX_DEPT
ON DEPARTMENT(DEPT_ID, DEPT_TITLE)
- 함수 기반 인덱스(FUNCTION-BASED INDEX) : SELECT 절이나 WHERE 절에 산술 계산식/함수식이 사용된 경우
* 계산식은 인덱스의 적용을 받지 X
--애초에 자주 사용하는 계산 값 자체에 INDEX 거는 것
CREATE TABLE EMP_SAL
AS SELECT EMP_ID, EMP_NAME, SALARY, BONUS,
(SALARY + (SALARY + NVL(BONUS, 0)))*12 연봉
FROM EMPLOYEE;
INDEX 재생성 : 인덱스 엔트리 논리만 제거하고 인덱스 다시 생성하는 것
=> 전체를 다 뜯었다가 다시 붙이는 개념(DROP의 개념은 아님..)
ALTER INDEX 인덱스명 REBUILD;
INDEX DICTIONARY
SELECT * FROM USER_INDEXES;
SELECT * FROM USER_IND_COLUMNS;
--INDEX 어디 COLUMN 에 걸려있는지 확인
INDEX 걸린것을 비교문에 사용했을 때 처리속도 빨라짐
SELECT * FROM T11 WHERE C1 = '123'; -- INDEX 걸린 비교문이라 빨라짐
SELECT * FROM T11 ORDER BY C3; --비교문에 걸려있지 않아서 속도 느림
예시
CREATE TABLE T8 (
C1 VARCHAR2(10),
C2 NVARCHAR2(10),
C3 CHAR(10),
C4 NCHAR(10)
);
INSERT INTO T8 VALUES('1234567890', '1234567890', '1234567890', '1234567890');
INSERT INTO T8 VALUES('123456789가', '123456789가', '123456780', '123456789가');
--ORA-12899: "SCOTT"."T8"."C1" 열에 대한 값이 너무 큼(실제: 12, 최대값: 10)
INSERT INTO T8 VALUES('1234567가', '123456789가', '123456789', '123456789가');
--ORA-12899: "SCOTT"."T8"."C3" 열에 대한 값이 너무 큼(실제: 12, 최대값: 10)
INSERT INTO T8 VALUES('1234567가', '123456789가', '1234567가', '123456789가');
--ok
--글자를 한 글자로 인식 -> 한글을 한개의 글자로 인식(3BYTE 아님)
INSERT INTO T8 VALUES('1234567가', '가나다라마바사아자차', '1234567가', '가나다라마바사아자차');
INSERT INTO T8 VALUES('1234567가', '가나다라마바사아자AB', '1234567가', '가나다라마바사아자차');
--ORA-12899: "SCOTT"."T8"."C2" 열에 대한 값이 너무 큼(실제: 11, 최대값: 10)
--알파벳도 한개의 글자로 인식
INSERT INTO T8 VALUES('1234567가', '가나다라마','1234567가', '가나다라마바사아자차');
INSERT INTO T8 VALUES('1234567가', '가나다라마','1234567', '가나다라마바사아자차');
CREATE TABLE T9 (
C1 VARCHAR2(10),
C2 NVARCHAR2(1000),
C3 CHAR(10),
C4 NCHAR(1000)
);
--*Cause: for datatypes CHAR and RAW, the length specified was > 2000;
-- otherwise, the length specified was > 4000.
CREATE TABLE T10 (
C1 VARCHAR2(4000),
C2 NVARCHAR2(1000),
C3 CHAR(10),
C4 NCHAR(1000)
);
CREATE TABLE T11 (
C1 VARCHAR2(4000),
C2 NVARCHAR2(1000),
C3 CHAR(2000),
C4 NCHAR(1000)
);
--*Cause: for datatypes CHAR and RAW, the length specified was > 2000;
-- otherwise, the length specified was > 4000.
--CHAR: 2000까지, VARCHAR2 는 4000까지
'데이터베이스' 카테고리의 다른 글
14. PROCEDURE & FUNCTION (0) | 2024.04.03 |
---|---|
13. PL/SQL (1) | 2024.04.03 |
0-2. 개발환경구축 (0) | 2024.04.03 |
0-1. 데이터베이스 개요 (0) | 2024.04.02 |
10. ORACLE OBJECT SEQUENCE (0) | 2024.04.02 |