// 데이터베이스 상태
- 테이블 내의 레코드 순서는 개발자가 원하는 정렬 상태가 아니다.
- order by 필요
- 어떤 데이터 검색 > 처음 ~ 끝까지 차례대로 검색 > Table full scan
- 특정 컬럼 선택 > 별도의 테이블에 복사 > 미리 정렬★★★ > 인덱스
// 인덱스, Index
- 검색을 빠른 속도로 하기 위해서 사용하는 도구
- 도서의 색인과 동일한 역할 > 수많은 내용 중 원하는 것을 빠르게 찾기 위한 도구
- SQL 명령 처리 속도를 빠르게 하기 위해서, 특정 컬럼에 대해 생성되는 도구
~ create index 인덱스명
on 테이블명(컬럼명);
- 장점: 검색 처리 속도를 향상시킨다.
- 단점: 너무 많은 인덱스 사용은 전체적인 DB 성능을 저하시킨다.
- 자동으로 인덱스가 걸리는 컬럼
1. primary key
2. unique
- 테이블에서 PK 컬럼을 검색하는 속도 >>> 테이블에서 일반 컬럼을 검색하는 속도
- 종류
1. 고유 인덱스
- 색인의 값이 중복이 불가능한 인덱스
- PK나 Unique 컬럼을 인덱스로 생성하면 고유 인덱스가 된다.
~ create unique index 인덱스명 on 테이블명(컬럼명);
2. 비고유 인덱스
- 색인의 값이 중복이 가능한 인덱스
- 일반 컬럼을 인덱스로 생성하면 비고유 인덱스가 된다.
3. 단일 인덱스
- 1개의 컬럼을 대상으로 검색할 때 생성한다.
4. 복합 인덱스
- 2개 이상의 컬럼을 대상으로 검색할 때 생성한다.
~ create index 인덱스명 on 테이블명(컬럼명1, 컬럼명2)
5. 함수기반 인덱스
- 컬럼으로 함수를 사용
~ create index idxSsn2 on tblIndex(substr(ssn, 8, 1));
- 인덱스를 사용하는 경우
1. 테이블에 데이터(행)가 많은 경우
2. where절에 사용되는 횟수가 많은 컬럼에 적용★★★★★★★★
3. join에 조건으로 사용되는 컬럼에 적용> 복합 인덱스(PK, FK)
4. 인덱스의 손익분기점 > 검색 결과가 10~15% 이하인 경우
5. null을 많이 포함하는 경우 > null은 인덱스에서 제외된다.
- 인덱스를 사용하지 말아야 하는 경우
1. 테이블에 데이터(행)가 적은 경우 > 의미가 없음
2. 인덱스의 손익 분기점 > 검색 결과가 15% 이상인 경우
3. 해당 테이블에 데이터 삽입/수정/삭제가 빈번하게 일어나는 경우★★★★★★★★
--1. 고유 인덱스
create unique index idxName on tblIndex(name);
--2. 비고유 인덱스
--3. 단일 인덱스
create index idxBuseo on tblIndex(buseo);
select count(*) from tblIndex where buseo = '기획부'; --0.016초
select count(*) from tblIndex where name = '유관순' and buseo = '기획부'; --0.125초 > 인덱스 부분 적용
--4. 복합 인덱스
create index idxNameBuseo on tblIndex(name, buseo);
select count(*) from tblIndex where name = '유관순' and buseo = '기획부'; -- 0.00초
select count(*) from tblIndex where buseo = '기획부' and name = '유관순'; -- 0.00초
--5. 함수 기반 인덱스
create index idxSsn2 on tblIndex(substr(ssn, 8, 1));
select count(*) from tblIndex where substr(ssn, 8, 1) = '1'; --0.499초
'데이터베이스(DB) > Oracle' 카테고리의 다른 글
[Oracle] 참조 레코드 삭제 (0) | 2023.03.29 |
---|---|
[Oracle] 일련번호 (0) | 2023.03.28 |
[Oracle] PL/SQL (1) | 2023.03.27 |
[Oracle] 복합키 (0) | 2023.03.24 |
[Oracle] 데이터베이스 설계 (0) | 2023.03.23 |