6장 Object

1. VIEW

  • 1개 이상의 테이블을 조합하여 만든 논리적인 가상테이블

  • 실제 데이터를 저장 및 관리하는것이 아닌, SELECT 쿼리문을 저장하는 객체

  • 저장한 SELECT쿼리문을 실행하여 테이블처럼 보여준다.

1) View 사용 이유

  1. 복잡한 쿼리문을 단순하게 표현하기 위해

  2. 테이블 내부에 일반사용자에게 접근이 허용되지 않은 민감한 정보가 포함된 경우 정보 은닉을 위하여 사용.

  3. 자주사용되는 SELECT 쿼리문을 재사용하기 위해.

2) View의 옵션들

  1. OR REPLACE - VIEW가 이미 존재하는 경우 새롭게 생성하는 옵션

  2. FORCE/NOFORCE - 에러를 무시하고 생성하는 옵션

  3. WITH CHECK OPTION - WHERE절에 사용된 컬럼에 대한 수정을 막는 옵션

  4. WITH READ ONLY - 수정할 수 없는 view를 생성하는 옵션

2. Sequence - 자동 번호 생성기

  • 오라클에서 기본키와 같이 고유한 숫자값이 필요한 칼럼에 사용하는 객체로, 고유한 숫자값을 자동으로 생성하는 역할을 한다.

  • NEXTVAL : 시퀀스에 저장된 값을 증가시키고, 증가된 시퀀스값을 반환하는 예약어

  • CURRVAL : 시퀀스에 현재 저장된 값을 반환시키는 예약어. 단, 현재 세션에서 NEXTVAL이 호출되어야만 CURRVAL을 사용할 수 있다.

3. Index

  • 데이터베이스에서 고속 검색을 지원하기 위해 사용하는 객체로, 테이블의 특정 컴럼에 대한 검색속도를 향상시킬 수 있다.

  • 마치 책의 목차처럼, 어디에 어떤 데이터가 저장되어 있는지 빠르게 찾을 수 있다.

  • 인덱스는 데이터를 보관할 때 인덱스로 지정한 칼럼의 값과, 실제 위치정보(ROWID)를 함께 보관한다(B*INDEX)

  • PRIMARY KEY, UNIQUE 제약조건 설정시 인덱스가 자동으로 생성된다.

  • INDEX는 DBMS의 HINT기능을 통해 명시적으로 사용되게 할수 도 있지만, 일반적으로 실행계획에 의해 자연스럽게 실행되도록 처리하는 것을 권장한다.

1) Index가 필요한 이유

  • 일반적인 쿼리문 예시)

SELECT * FROM EMPLOYEE WHERE EMP_NAME = '경민';
  • 인덱스가 지정되지 않은 칼럼(EMP_NAME)으로 데이터를 조회하면 DB는 일반적으로, 테이블 데이터의 처음부터 끝까지 읽는 Full Table Scan방식으로 쿼리문을 처리합니다.

  • 테이블에 저장된 데이터가 적다면 상관 없지만, 저장된 데이터가 수백만 건 이상이라면 성능이 크게 저하될 수 있습니다.

  • 이 때 EMP_NAME칼럼을 통해 INDEX를 생성하면 특정 값을 통해 탐색할 수 있어 조회성능이 크게 상승한다

2) Index의 저장구조

  1. B-Tree Index(oracle default index)

  • 모든 리프노드가 동일한 깊이를 가지며, 정렬된 자료(Balanced Tree)를 빠르게 검색하기 위한 자료구조이다.

  • ROOT와 BRANCH 노드는 각 하위노드가 가지고 있는 데이터 값의 범위를 저장하고 있으며, 실제 데이터는 LEAF노드가 행번호(ROWID)와 함께 보관하고 있으며, 보관하고 있는 데이터는 오름차순 정렬시켜서 순차적으로 보관한다.

  1. Bitmap 인덱스

  • 값의 종류가 적고 중복이많은 칼럼에 사용하는 인덱스

  • BLUE의 0 0 0 1 0 0 1 0 1 0이 가지는 의미는 BLUE값이 4번,7번9번행에 보관되어 있다는 의미

  • 상품테이블에서 색상값이 BLUE인 요소를 찾을때는 blue의 비트맵을 통해 4번,7번 9번 행만 곧바로 찾으면 빠르게 데이터 조회가 가능하다.

  1. 그 외 인덱스들

    1. Uniquew 인덱스, Composite 인덱스, Function 인덱스 등.

3) Index 동작방식

4) Index사용시 주의사항

  1. DML에 취약하다

    1. 테이블에 INSERT/UPDATE/DELETE가 발생할 때마다 Index도 함께 변경된다.

    2. 따라서INSERT/UPDATE/DELETE가 빈번한 테이블에는 많은 컬럼을 인덱스로 만들지 않는 게 좋을 수 있다.

  2. 인덱스가 많을 수록 저장공간이 더 많이 필요해진다.

  3. 잘못된 칼럼의 인덱스 생성시 성능이 오히려 저하될 수 있다.

    1. 인덱스를 생성한다고 그 인덱스가 반드시 사용될것 이라는 보장이 없다.

    2. DBMS의 실행계획을 확인하여, INDEX를 추가한 후 해당 INDEX를 사용하지 않고 쿼리문을 실행한다면 의미 없는 인덱스가 생성된 것.

Last updated