개발/database

[DB] SEQUENCE, INDEX, SYNONYM

yun000 2024. 12. 18. 17:51

<SEQUENCE>

=자동으로 unique한 번호 생성

공유 가능한 객체, 여러 테이블에서 사용 가능

주로 기본키에 저장될 값 만드는 데 사용

애플리케이션 코드 대체

메모리 Cache되면 시퀀스 값 사용하는 효율성 향상

 

시퀀스 생성

예제

create sequence depts_seq
	start with 91
        increment by 1
        maxvalue 100
        nocycle
        nocache;

시퀀스 확인

select seqence_name, min_value, max_value,
	increment_by, last_number
from user_sequences;
select object_name
from user_objects
where object_type='SEQUENCE';

 

NEXTVAL과 CURRVAL

nextval:다음 사용 가능한 시퀀스 값 return

currval:현재 시퀀스 값 return

currval참조 전에 nextval이 먼저 이용되어야 한다.

 

시퀀스 사용

ex) depts테이블에 새로운 부서 정보 삽입

--depts테이블에 새로운 부서 정보 삽입
insert into depts(deptno, dname, loc)
values (depts_seq.nextval, 'marketing', 'san diego');

--depts_seq시퀀스에 대한 현재 값 본다
select depts_seq.currval from sual;

 

시퀀스 수정

=MAXVALUE한계에 도달한다면 더 이상 시퀀스 값 할당 받을 수 없다. + 에러 발생

시퀀스 계속 사용하기 위해 alter sequence로 수정할 수 있다.

 

ex) depts_seq최대값을 99999로 변경

alter sequence depts_seq
	MAXVALUE 99999;

 

시퀀스 삭제

drop sequence로 시퀀스 제거 가능

drop sequence 시퀀스이름;

 

IDENTITY COLUMN

시퀀스 대체를 위해 테이블 정의, 수정시

열레벨에 identity구문을 포함할 수 있다

generated [always | by default ]on null]]
as identity [(identity_options)]

CTAS명령으로 생성한 테이블은 Identity속성 상속안받음. not null속성만 상속받는다!

 

예제

create table depts
(
	deptno number(2) generated always as identity
    				(start with 10 increment by 10).
        dname varchar2(14),
        loc varchar2(13) unique,
        constraint depte_deptno_pk primary key(deptno)
);

generated always as identity=항상 값을 알아서 만드는 것. 값을 주면 안된다

(start with 10 increment by 10) 10부터 시작하여 10씩 시작한다는 말

그러므로

deptno열 값은 지정하지 않아도 된다.

insert into depts(dname, loc)
values('MARKETING', 'SAN DIEGO');

 

 

<INDEX>

=data검색을 더 빠르게 가능하게 하는 데이터 구조

자동 인덱스=primary key, unique제한 규칙으로 자동 생성되는 인덱스

수동 인덱스=create index명령어로 만드는 인덱스

 

인덱스 생성

자동 생성 = primary key, unique키 제약조건 정의시 자동 생성

수동 생성 = 행에 대한 액세스 시간 향상시키기 위해 열에서 유일하지 않은 인덱스를 생성 가능

create [unique|bitmap] index 인덱스명
on 테이블이름 (열이름, 열이름, 열이름...);

 

 

1. 인덱스 생성 전 실행 계획

select * from emps where first_name='David';

데이터 조회 후 F10으로 실행계획 확인하면

table access(full) 인것을 볼 수 있다

 

2. 인덱스 생성 후 실행 계획

create_index emps_first_name_idx
on emps(first_name);

데이터 조회 후 F10으로 실행계획 확인하면

table access(by index rowid)  인것을 볼 수 있다

 

인덱스 삭제

=필요없으면 지워도 괜찮다.

삭제해도 데이터에는 아무런 영향 미치지 않는다.

index소유자 이거나 drop any index권한을 가져야만 지울 수 있다.

 

조회 성능을 높이지만 새로운 데이터가 많이 쏟아질 경우

인덱스를 재구성해야 하고 이것이 시간이 많이 걸리므로 차라리 지우는 것이 더 좋다

drop index 이름;

 

인덱스를 언제 만들어야할까?

인덱스 생성 권장

- 열이 where절 또는 조인 조건에 자주 사용될 경우

- 열이 광범위한 값을 포함할 경우

- 열이 많은 수의 Null값을 포함한 경우

- 둘 또는 이상의 열이 where 절 또는 조인 조건에서 자주 함께 사용될 경우

- 테이블은 대형이고 대부분 질의가 행의 2~4% 보다 적게 읽을 것으로 예상할 경우

 

인덱스 생성하지 않는 것 권장하는 경우

- 테이블 작다

- where join절에 거의 안쓰일 경우

- 질의가 한번에 많이 읽을 때

- 자주 테이블이 갱신될 때.

 

인덱스 확인

인덱스 정보 확인

 

select * from USER_INDEXES;

인덱스 이름, 유형, 테이블,이름, 유일성 여부 등을 알 수 있다.

 

select * from user_ind_columns;

테이블명, 컬럼이름, 컬럼 위치 길이, 인덱스와 관련된 컬럼 등..

 

인덱스 종류

1. Bitmap 인덱스

=인덱스에 저장된 컬럼 값들을 binary화 하여 저장. 

적은 개수, 독특한 값일 경우 적합

테이블 크기 변경이 잘 없을 때 적합

 

2. Unique 인덱스

=Primary Key, Unique제약 조건시 자동 생성. 중복X

 

3. 함수기반 인덱스

= 인덱스 사용한 컬럼에 중복 데이터 값 가질 수 있다

 

4. 복합 인덱스

=2개 이상~16개의 컬럼수 로 이루어진 인덱스

<SYNONYM>

=동의어를 생성하여 객체 액세스를 단순화 한다.

긴 이름을 가진 객체들에 유용하게 사용

 

public:다른 사람도 쓸 수 있게 하는

create [public] SYNONYM 동의어 이름
for 이전이름;

 

예제

단축 이름 생성

create synonym emp60
for emp_dept60;

동의어 삭제

drop synonym emp60;