해당 글은 전적으로 [ 꿈꾸는 개발자, DBA 커뮤니티 구루비 ] 에서 참고하였음을 밝힙니다. 개인 공부 및 기록을 위한 글입니다. 따라서 옮기는 과정에서 경어체는 모두 제거하였으며, 본인의 관점으로 글을 작성하였습니다. 상세하고 정돈된 내용은 하단에 참고링크를 보시길 바랍니다.

인덱스 (Index)

테이블이나 클러스터에서 쓰여지는 선택적인 객체이다. SQL 수행속도를 향상시키기 위해서 고안되었으며 인덱스가 수행하는 역할은 우리가 단어를 찾을 때 사전의 인덱스와 별반 차이가 없다. 만약 데이터베이스에 인덱스가 없다는 것은 전체 데이터를 일일이 액세스를하면서 찾고자 하는 데이터를 확인해야 한다. 단순히 SELECT 구문 뿐만 아닌, DELETE, UPDATE (DML : 데이터 조작어) 수행에 대해서도 인덱스가 필요하다. 아래는 인덱스에 대한 정의를 정리하였다.

    • Table Row에 하나씩 대응되는 별도의 객체(Object)
    • 옵티마이저가 최적의 경로를 결정하기 위해 사용하는 요소(Factor)
    • 인덱스는 생성시킨 컬럼의 값과 Table Row의 ROWID 로 구성되어 있으며, 이들은 서로 정렬되어 있다.
    • 인덱스는 하나의 테이블에 여러 개를 지정할 수 있고, 하나의 컬럼이 여러 개의 인덱스에 포함될 수 있다.
    • 테이블과 무관하게 생성 및 삭제를 독립적으로 할 수 있다.
    • 자동 인덱스 : PK 또는 UNIQUE 제약조건에 의해 자동적으로 생성된 인덱스
    • 수동 인덱스 : CREATE INDEX 명령을 실행해서 만드는 인덱스

인덱스는 오라클 데이터베이스의 테이블 내 원하는 레코드를 빠르게 찾아갈 수 있도록 만들어진 데이터구조. 기본적인 목적은 검색 성능의 최적화.


+) 무결성에 관하여

무결성은 데이터베이스에 저장된 값들은 정확한 상태를 유지하고 있어야 함을 의미한다. 무결성은 데이터의 정확성유효성을 의미한다.


- 무결성의 종류

  • 엔티티 무결성 (Entity Integrity)
    - 엔티티에 존재하는 모든 인스턴스는 고유해야하며, 널(null) 값을 가지면 안된다.
    - 엔티티에는 동일한 주 식별자가 존재할 수 없으며, 주 식별자 속성은 널 값을 허용할 수 없다.

  • 참조 무결성 (Referential Integrity)
    - 엔티티의 외래 식별자 속성은 참조되는 엔티티의 주 식별자 값과 일치하거나 널 값이어야 한다.

  • 도메인 무결성 (Domain Integrity)
    - 속성 값과 관련된 제약이다.
    - 엔티티의 특정 속성 값은 같은 데이터 타입과 테이터 길이, 널 값 여부, 기본값 및 허용값 등 동일한 범주의 값만이 존재하여야 한다.

  • 업무 무결성 (Business Integrity)
    - 기업에서 업무를 수행하는 방법이나 데이터를 처리하는 규칙을 의미
    - 업무 무결성을 물리적으로 강제하는 대표적인 방법에는 트리거(Trigger)가 존재


- DBMS 차원에서의 제약 (Constraint)
[ 클릭하면 사진 더 크게 보임 ]


인덱스를 생성 시 고려해야할 사항

- WHERE절이나 JOIN 조건 안에서 자주 사용되는 컬럼

- null 값이 많이 포함되어 있는 컬럼

- WHERE 절이나 JOIN 조건에서 자주 사용되는 두 개 이상의 컬럼

- 참조 제약조건이 있는 컬럼에 생성

- 데이터 량이 많은 테이블에 있어 전체 데이터의 15% 이하의 데이터를 조회하는 경우 인덱스를 생성한다. 조회된 데이터의 수가 15% 를 넘어가는 경우 인덱스를 통해 조회하는 것보다 풀 스캔으로 조회하는 것이 빠를 수 있다.

- 테이블 간 조인에 사용되는 컬럼을 인덱스 컬럼으로 선택하면 조인 성능이 향상

- INSERT, UPDATE, DELETE 등이 많이 발생하는 테이블에는 인덱스를 너무 많이 만들지 않도록 한다. 왜냐하면 데이터의 변경이 발생하면 그에 따른 인덱스 정보도 갱신되기 때문에 성능에 영향을 끼친다.


인덱스의 종류

인덱스의 종류에는 크게 두가지가 있으며 종류는 아래와 같다.

 

- 물리적 인덱스 : B-tree 인덱스, Bitmap 인덱스

- 논리적 인덱스 : 단일 열 인덱스, 결합 인덱스, Unique 인덱스 Non-Unique 인덱스


BITMAP 인덱스

- 비트맵 인덱스는 각 컬럼에 대해 적은 개수의 독특한 값이 있을 경우에 사용하는 것이 좋다.

- 비트맵 인덱스는 B-tree 인덱스가 사용되지 않을 경우에서 성능을 향상 시킨다.

- 테이블이 매우 크거나 수정/변경이 잘 일어나지 않는 경우에 사용할 수 있다. 


B-Tree 인덱스

- RDBMS에서 가장 일반적으로 사용되는 인덱스이다. 


UNIQUE 인덱스

- 유니크 인덱스는 인덱스를 사용한 컬럼의 중복값들을 포함하지 않고 사용할 수 있는 장점이 있다.

- PK와 UNIQUE 제약 조건시 생성되는 인덱스는 UNIQUE 인덱스이다.

1
2
3
SQL> CREATE UNIQUE INDEX emp_empno_IDX ON emp(empno);
 
Index created.
cs


NON-UNIQUE 인덱스

- NON-UNIQUE 인덱스는 인덱스를 사용한 컬럼에 중복 데이터 값을 가질 수 있다.


단일열 인덱스

- 인덱스 키에 오직 하나의 열을 가지고 있는 형태를 말한다. 

1
2
3
SQL> CREATE INDEX emp_empno_index ON emp(empno);
 
Index created.
cs

위의 내용은 emp 테이블에서 empno라는 컬럼에 대한 인덱스를 생성(지정)하는 구문이다.


결합 인덱스

- UNIQUE 인덱스를 하나의 컬럼이 아닌 두 개 이상의 복수개의 컬럼에 생성할 수 있다. 복수키 인덱스가 가질 수 있는 최대 컬럼의 값은 16개이다.

1
2
3
SQL> CREATE INDEX emp_empno_ename_IDX ON emp(empno, ename);
 
Index created.
cs


+) 개인의견

Index 그리고 Primary Key 에 대한 공부를 하였지만 여전히 부족하다는 생각이 든다. 아직 많이 경험을 하지 않았기 때문에 그렇다고 생각한다. 더불어 이와 관련된 괜찮은 글이 있어서 들고 올 수 있었다. 항상 이해위주의 공부를 해야함을 잊지말자.


사실 Primary Key 와 Unique Index 둘 사이의 차이점을 말하는 것이 아닌 둘 사이의 상관관를 말하는 것이 더 올바른 개념이다. 우리가 아는 기본기 즉, Primary Key논리적인 개념이다. 실제로 값이 존재하긴 하지만 "Primary Key" 라고 값이 저장되지 않는다. PK는 해당 컬럼이 그 테이블의 식별자임을 나타내는 것으로 자신과 다른 레코드가 서로 다른 인스턴스 임을 확인할 수 있게 해주는 역할이다. 결국 PK는 해당 레코드의 존재 그 자체인 것이다.


하지만 PK Constraint 는 물리적인 개념이다. 이 컬럼들은 다른 레코드와 구분짓는 식별자 역할을 하는 중요한 컬럼이므로 데이터는 중복을 허용해서는 안된다. 즉 유니크(Unique)한 성질을 지니고 있어야 한다. 또한 널 값을 허용해서도 안된다. Primary Key Constraint를 설정하면 unique index 와 not null constraint가 자동적으로 생성되는 이유가 여기에 있다. 한가지 더 중요한 사실은 PK 를 만들면 Unique 인덱스가 생성되는 것이지 PK UNIQUE 제약조건을 가지는 것이 아니다.


결론적으로, Index 와 PK 의 상관관계에 있어서 Unique 이든 Non-Unique 이든 Index 는 PK 컬럼의 유니크한 성질을 보장하기 위한 하나의 도구(Tool)에 지나지 않는다고 한다.


앞서서 말했다시피 PK는 논리적인 개념이 크다. 좀 더 깊이 들어가게 되면 "해당 컬럼들이 테이블의 식별자(identifier)이므로 중복을 허용해서는 안되며, 널 값을 허용해서도 안된다." 라는 의미론적(semantic) 인 의미에서 정의하는 것이며 DBMS는 이를 효과적으로 처기하기 위해서 인덱스를 자동 생성하고 not null constraint 를 정의하는 것이다.


PK를 준다는 것은 DB 측면에서 옵티마이저가 빠른 실행계획을 만드는데 도움을 주는 것이며, 모델링 측면에서 Relational 개념에 부합하는 것이다.



Posted by doubler
,