DDL 시퀀스/인덱스

vencott·2021년 5월 19일
0

sinc 인턴교육

목록 보기
8/18

시퀀스

순차적으로 정수 값을 자동으로 생성하는 객체

테이블당 각각의 시퀀스를 만들어 놓고 그 테이블의 기본키나 대체키로 사용

CREATE SEQUENCE sequence_name

[INCREMENT BY n][START WITH n]

[{MAXVALUE n | NOMAXVALUE}][{MINVALUE n | NOMINVALUE}]

[{CYCLE | NOCYCLE}][{CACHE n | NOCACHE}];

  • NEXTVAL
    • sequence_name.NEXTVAL
    • 새로운 시퀀스 값을 반환
  • CURRVAL
    • sequence_name.CURRVAL
    • 현재 시퀀스의 마지막 값을 반환
// CREATE SEQUENCE
CREATE SEQUENCE SEQ_EMPID
START WITH 300
INCREMENT BY 5
MAXVALUE 310
NOCYCLE
NOCACHE;

SELECT SEQ_EMPID.NEXTVAL FROM DUAL;
// VALUE로 사용
INSERT INTO EMPLOYEE (EMP_ID, EMP_NO, EMP_NAME)
VALUES (TO_CHAR(SEQ_ID.NEXTVAL), 123, 'KIM');

인덱스

테이블의 row와 하나씩 대응되는 별도의 객체

Optimizer가 최적의 실행 경로를 설정하는데 중요한 Factor가 됨

  • -> 성능 및 튜닝의 관점에서 중요

모든 테이블에는 ROWID, ROWNUM이라는 컬럼이 숨겨져 있다

구성

인덱스를 생성시킨 컬럼의 값(VALUE) + 그 행의 논리적 주소(ROWID)

성능 향상

  • 인덱스를 이용해서 별도의 정렬 없이 결과 추출
  • 물리적인 디스크 I/O 감소

기본키는 INDEX가 걸려있다

외래 키도 자주 참조하므로 INDEX를 걸 수 있으나 NULL이 들어있으면 INDEX가 풀려버림

  • -> 현업에서는 외래 키에 NULL값을 주지 않는다

인덱스 생성

CREATE [UNIQUE] INDEX index_name ON table_name (column_list | function, expr);

  • UNIQUE INDEX
    • 기본키에 해당
    • UNIQUE 제약이 같이 걸려 중복 값이 들어갈 수 없게 된다 --> 현업에서 잘 안 씀
    • CREATE UNIQUE INDEX IDX_NUM ON DEPARTMENT(DEPT_NAME);
  • NON-UNIQUE INDEX
    • 현업에서 보편적
    • CREATE INDEX IDX_JID ON EM
    • PLOYEE(JOB_ID);

인덱스 삭제

DROP INDEX index_name ON table_name;


SQL 성능 향상을 위한 JOIN의 의해

NESTED LOOP JOIN

모든 JOIN에서 사용

하나의 테이블을 기준으로 순차적으로 상대 테이블의 ROW를 결합하여 원하는 결과를 추출하는 테이블 JOIN 방식

DRIVING 테이블: 결합하기 위한 기준 테이블

DRIVEN 테이블: 결합되기 위한 테이블

DRIVING 테이블 선정에 따라 수행 시간의 엄청난 차이 발생

  • JOIN 할 때 테이블을 거는 순서가 중요한 것과 관련

TIP) JOIN 할때 부모부터 거는 게 아니라 레코드 수가 적은 것부터 거는 방식을 택한다

인덱스가 있어야 NESTED LOOP JOIN의 제대로 된 성능을 보장할 수 있다

TIP) WHERE절에 있는 컬럼에 인덱스가 있어야지만 NESTED LOOP JOIN이 빛을 발할 수 있다

HASH JOIN

EQUI JOIN에서만 가능

SORT MERGE JOIN

잘 사용 X


출처: SHINSEGAE I&C 인턴십

profile
Backend Developer

0개의 댓글