몰입하며 나아가는 개발이란

Language/SQL

Oracle SQL Sequence, Index (시퀀스, 목차(색인))

류하을 2019. 12. 26. 19:50

Sequence란?

유일한 값을 생성해주는 Oracle Object 이며,

유일한 값이기 때문에 Primary Key 와 속성이 같기 때문에 PK 값으로 주로 사용 한다.

즉, 순차적으로 증가하는 Column을 하나 만들 수 있으며,

SEQUENCE는 스키마에서 테이블과는 독립적으로 저장되고 생성된다.

 

주로 사용하는 곳은 회원번호, 게시판 관리 글 번호 등이 있으며,
초기화가 불가능하므로 삭제후 다시 작성하는것이 일반적이다.


SEQUENCE : 생성

CREATE SEQUENCE test_seq -- test_seq 이름으로 시퀀스 생성.
INCREMENT BY 1 -- 증가 설정
START WITH 10 -- 시작 숫자 설정
MAXVALUE 100 -- 최대 설정 (보통생략함.)
MINVALUE 1; -- 최소 설정 

SEQUENCE : 진행

SELECT test_seq.NEXTVAL -- 진행값 확인
FROM dual;

SEQUENCE : 확인

SELECT test_seq.CURRVAL -- currentvalue 현재 seq 값 확인
FROM dual; -- 바로실행시 오류가 나옴 nextval 실행후 실행시켜야함.

SEQUENCE : 사용

-- sequence 사용예제
INSERT INTO employees
VALUES (employees_seq.NEXTVAL)

-- sequence 수정
ALTER SEQUENCE test_seq
INCREMENT BY 3;

-- SEQUENCE는 초기화가 불가 하므로 지우고 다시 생성해야한다.
DROP SEQUENCE test_seq;

SYNONYM 과 SEQUENCE : 사용

-- 동의어 (SYNONYM / 객체의 별명)
/*
Oracle DB 개발자들은 자주사용함.
int array_position_number[];
int arrPosNum[] = array_position_number[];
*/
CREATE SYNONYM "사원들"
FOR employees;

INSERT INTO  "사원들"
VALUES (employees_seq.NEXTVAL, '길동', '홍', 'hgd.naver.com', '123-456-8910', 
TO_DATE('20051001', 'YYYYMMDD'), 'IT_PROG', 20000, NULL, 100, 10);

INDEX 란?

Index 는 사전적 의미로 색인, 목차 라고하며, SQL에서도 동일한 의미로 사용된다.
원하는 정보의 위치를 빠르고 정확하게 알아 낼 수 있는 방법이라고 봐도 무방하다.
SQL 에서 Index는 자동생성과 수동생성이 있다.
-- 자동생성 : Primary key, Unique key
-- 수동생성 : Query

생성을 했을때 효울적인 경우가 있고 비효율적인 경우도 있으므로 아래를 참고하자.

효율적인 경우 :
1.WHERE 절이나 JOIN 조건안에 자주 사용 되는 COLUMN이 여기에 해당한다.
ex1) department_id -primary key 이기때문에 자동생성되어져있다.
2.NULL 값이 많이 포함되어 있는 column
ex2) hr계정 기준 manager_id 와 비슷한 Column
3.WHERE절이나 JOIN조건간에 두개이상 사용하는 COLUMN 일 경우 

비효율적인 경우 : 
1.테이블의 크기가 작을때 (LOW)가 작을때 사용하면 오히려 역효과이다. 3000개 이하.
2.테이블이 자주 갱신될때 COLUMN의 추가 생성이 자주 일어날때

즉, 일반적으로는 Primary key 로 설정이 되어있어 자동생성이 되어있기 때문에 수동으로 생성하는 경우는 잘없다.


INDEX : 자동 생성 확인

CREATE TABLE emp_copy
AS
SELECT * FROM employees; -- 복사할 경우 제약조건이 없음.

-- 자동생성 (기본키와 고유키를 생성하면 자동생성된다.)
ALTER TABLE emp_copy
ADD 
CONSTRAINT pk_empcopy_01 PRIMARY KEY (employee_id);

-- INDEX 확인
SELECT * FROM ALL_INDEXES
WHERE index_name = 'pk_empcopy_01';

INDEX : 강제 생성 확인

-- 강제생성
CREATE INDEX emp_copy_index01
ON emp_copy(manager_id);

SELECT * FROM ALL_INDEXES
WHERE index_name = 'emp_copy_index01';

DROP INDEX pk_empcopy_01; -- "cannot drop index used for enforcement of unique/primary key"
DROP INDEX emp_copy_index01;