본문 바로가기

데이터베이스(DB)/Oracle
[Oracle] 인덱스

// 데이터베이스 상태 
    - 테이블 내의 레코드 순서는 개발자가 원하는 정렬 상태가 아니다.
    - 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