오라클 객체 종류(데이터사전, 인덱스, 뷰, 시퀀스)

조예빈·2024년 4월 5일
0

Oracle

목록 보기
15/26
post-custom-banner

데이터 사전

  • 오라클 DB = 사용자 테이블(user table) + 데이터 사전(data dictionary)
  • 사용자 테이블 : DB를 통해 관리할 데이터를 저장하는 테이블
  • 데이터 사전에는 DB 메모리, 성능, 사용자,권한, 객체 등 오라클 DB 운영에 중요한 데이터가 포함되어 있음
  • 데이터 사전은 특수한 테이블이며, DB 생성 시점에 자동으로 만들어짐

DBA_ 접두어를 가진 데이터 사전

  • DB 관리 권한을 가진 사용자만 조회할 수 있는 테이블
  • SCOTT 계정으로는 조회가 불가능
    • SCOTT 계정으로 조회하면 테이블이 존재하지 않는다는 오류 메세지가 나옴 -> 진짜 있어도 없다고 나오고, 진짜 없어도 없다고 나옴(보안성이 좋음)

인덱스

  • 색인
  • 오라클 DB에서 데이터 검색 성능의 향상을 위해 테이블 열에 사용하는 객체
  • 테이블에 보관된 특정 행 데이터의 주소(위치 정보)를 책 페이지처럼 목록으로 만들어 놓은 것
  • 인덱스는 테이블 열을 여러 가지 분석을 통해 선정하여 설정할 수 있음
  • 데이터 검색 방식 : Table Full Scan, Index Scan
  • index를 사용하면 작업 속도가 조금 느려짐 -> 이진트리로 균형이 잡혀있기 때문
SELECT * FROM USER_INDEXES;

  • 인덱스는 모든 DB에 공통적으로 적용됨
장점단점
검색 속도가 빠름추가 저장 공간이 필요함
시스템 부하를 줄여 성능이 향상됨인덱스 생성 시간이 소요됨
INSERT, UPDATE, DELETE 성능이 저하됨

Table Full Scan

  • 처음부터 끝까지 검색하여 원하는 데이터를 찾는 방식

Index Scan

  • 인덱스를 통해 데이터를 찾는 방식
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);


-> Table Full Scan

-> Index Scan

인덱스로 사용할 컬럼

  • where절(조건절)에 자주 사용되는 칼럼

  • 조인시 조건

  • 두개 이상의 칼럼인 경우 복합 인덱스(동시에 검색)

  • 숫자, 날짜, 문자(CHAR)

  • Primary Key, Unique Key 제약조건 자동 생성

  • 칼럼의 값을 가공하기 전 상태에서 조건 지정

PK

  • 인덱스에 자동으로 추가됨
  • 복합인덱스 생성 시 PK를 앞쪽에 지정

스캔 범위 비교

  • ex) 주문내역
    주문 일자 2024년 1월 1일 ~ 2024년 1월 30일 : 10,000건
    상품번호 ABC -> 100건
    검색 : 1월에 ABC 상품을 주문한 내역 조회
    -> 상품번호를 앞쪽에 놔야 함(100개 중 1월 1일을 찾는 것이 더 범위가 좁고, 그래서 더 빠르기 때문)
    => 데이터가 많을 때, 먼저 범위를 줄일 수 있는 것을 앞에 두는 것이 유리함

인덱스 설계 전략

  • 검색에 자주 사용되는 컬럼을 앞쪽에 둠
  • 데이터 개수가 작은 컬럼을 앞쪽에 둠
  • 코드(숫자, 범주형 데이터), 날짜, 정렬컬럼, 조인컬럼

VIEW

  • 뷰 = 가상 테이블(virtual table)
  • 하나 이상의 테이블을 조회하는 SELECT문을 저장한 객체 -> SELECT문에 저장했기 때문에 물리적 데이터를 따로 저장하지는 않음
  • 뷰를 SELECT문의 FROM절에 사용하면 특정 테이블을 조회하는 것 과 같은 효과를 얻을 수 있음
  • 테이블명이 들어가는 자리에 뷰를 사용하면 됨. 그럼 서브쿼리를 사용하는 것 처럼 보임(실제로 서브쿼리가 실행되는 것은 아님)
  • CREATE VIEW 당시의 시점의 데이터가 나옴. 실시간으로 정보가 반영되지 않음
  • 뷰는 한 번 만들면 계속 있음
서브쿼리
SELECT * FROM VW_EMP20;SELECT * FROM(SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO = 20);

사용 목적

  1. 속도가 빨라짐
  2. 불필요한 데이터의 노출을 막을 수 있음

Sequence(시퀀스)

  • 순번 : 순서가 있는 번호

  • 오라클 DB에서 특정 규칙에 맞는 연속 숫자를 생성하는 객체

  • 은행이나 병원의 대기 순번표와 마찬가지로 번호를 사용해야 하는 사용자에게 계속 다음 번호를 만들어주는 역할을 함

  • 단지 연속하는 새로운 번호를 만드려면 아래와 같이 해도 됨. 하지만,동시에 여러 곳에서 새로운 번호를 요구했을 때 결과값이 중복될 가능성이 있으며 테이블 데이터가 많아질수록 시간도 늘어난다는 문제점이 있음

SELECT MAX(글 번호) + 1
FROM 게시판 테이블

CREATE SEQUENCE 시퀀스이름
[INCREMENT BY n] //증가값(선택)
[START WITH n] //시작값(선택)
[MAXVALUE n | NOMAXVALUE] //최대(선택)
[MINVALUE n | NOMINVALUE] //최소(선택)
[CYCLE | NOCYCLE] //순환(선택)
[CACHE n | NOCACHE] //미리 저장해 두는 것(선택)

  • DEPT 테이블을 사용하여 DEPT_SEQUENCE 테이블 생성하기
CREATE TABLE DEPT_SEQUENCE
AS SELECT * FROM DEPT
WHERE 1 <> 1;

SELECT * FROM DEPT_SEQUENCE;

시퀀스 이름

객체의 앞에 객체의 종류를 뜻하는 것을 붙임
ex)SEQ_DEPT

-> 실무에서는 보통 이렇게 만듦

CREATE SEQUENCE SEQ_DEPT INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 MINVALUE 1;

시퀀스 현재값 확인

SELECT SEQ_DEPT.CURRVAL FROM DUAL;

위의 코드를 바로 실행하면 다음과 같은 에러가 발생한다

ORA-08002: sequence SEQ_DEPT.CURRVAL is not yet defined in this session
08002. 00000 - "sequence %s.CURRVAL is not yet defined in this session"
Cause: sequence CURRVAL has been selected before sequence NEXTVAL
Action: select NEXTVAL from the sequence before selecting CURRVAL

세션에서 아직 정의되지 않았다는 에러이다. 현재 세션에서 NEXTVAL을 해야지만 현재 값을 갖고 올 수 있다. 세션에 아무것도 없는 데 현재 값을 가지고 올 수는 없기 때문이다. 즉, 시퀀스는 세션을 기반으로 고유 번호를 생성한다는 사실을 알 수 있다.

시퀀스 다음값 확인

SELECT SEQ_DEPT.NEXTVAL FROM DUAL;

다음값을 확인한 후 현재값을 확인해야 값이 나옴

시퀀스 사용

  • 시퀀스에서 생성한 순번을 사용한 INSERT문 실행하기
INSERT INTO DEPT_SEQUENCE VALUES (SEQ_DEPT.NEXTVAL, 'DATABASE', 'SEOUL');
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;

SYNONYM(동의어)

  • 테이블, 뷰, 시퀀스 등 객체 이름 대신 사용할 수 있는 다른 이름을 부여하는 객체
  • 별칭과 다름
  • 잘 사용하지 않음
  • 주로 테이블 이름이 너무 길어 사용이 불편할 때 좀 더 간단하고 짧은 이름을 하나 더 만들어 주기 위해 사용 -> 처음부터 테이블 명을 잘 지으면 됨

    CREATE [PUBLIC] SYNONYM 동의어 이름
    FOR [사용자.][객체이름];

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러
post-custom-banner

0개의 댓글