Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

붓, 그리다

인덱스, 시퀀스 본문

Oracle

인덱스, 시퀀스

붓그린 2017. 6. 16. 16:56

[ 인덱스 index ]

- 책갈피와 같은 역할
- 인덱스가 부여된 필드를 먼저 찾아준다.
- 자주 사용되는 컬럼에 부여=자주 검색이 되는 필드(where 조건식)
- 데이터 저장공간이 필요(<->저장공간이 필요없는 것 : view)
- Primary key, Unique constraint 정의 시 자동으로 인덱스 생성(unique index)

*Primary key : not null+unique 키가 부여
- 중복되지 않고 빨리 찾아주길 원하는 데이터가 부여



[ 인덱스 종류 ]

1) Unique index
- 자동으로 primary key가 생성

create unique index 인덱스명(테이블명_필드명_idx)
 on 적용 테이블명(필드명1)


2) non-unique index
- 중복이 되도 괜찮은 필드에 부여(job, 성별, 직급 등)

create index 인덱스명(테이블명_필드명_idx)
 on 적용 테이블명(필드명1)
 on 적용 테이블명(필드명1,필드명2) -> 복합키


*인덱스가 부여되면 안되는 경우 
- 데이터가 자주 변경이 되는 데이터
-> 수정이 자주되는 필드에 인덱스 부여할 경우 내부적으로 정렬을 하여 찾는 속도가 느려짐



[ 인덱스 조회 방법 ]

1) user_indexs : 인덱스 이름, 고유의 정보
2) user_ind_columns : 인덱스가 어떤 필드에 적용되었는지, 인덱스 이름, 테이블, 필드명
3) 즉, 1) + 2)를 조인을 하라는 의미




Q3. 인덱스를 생성하고 생성된 인덱스를 조회하시오

1) b_emp2테이블 ename에 index 생성

create index emp_ename_idx
 on emp(ename);

인덱스가 생성되었습니다.



2) 인덱스 조회

- user_ind_columns(c) : index_name, column_name, column_position
- user_indexes(i) : uniqueness

select c.index_name,c.column_name,c.column_position,
 i.uniqueness 
 from user_indexes i, user_ind_columns c
 where c.index_name=i.index_name
 and c.table_name='&table_name'; 

table_name의 값을 입력하십시오: EMP
구   5:  and c.table_name='&table_name'
신   5:  and c.table_name='EMP'

INDEX_NAME
------------------------------
COLUMN_NAME
--------------------------------------------------------------------------------
COLUMN_POSITION UNIQUENES
--------------- ---------
EMP_ENAME_IDX
ENAME
              1 NONUNIQUE // 중복을 허용해주는 필드

PK_EMP
EMPNO
              1 UNIQUE // PRIMARY KEY를 부여하면 자동으로 생성

INDEX_NAME
------------------------------
COLUMN_NAME
--------------------------------------------------------------------------------
COLUMN_POSITION UNIQUENES
--------------- ---------



 
3) 뷰 만들기

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  create or replace view v_index
  2  as
  3  select c.index_name,c.column_name,c.column_position,
  4   i.uniqueness
  5   from user_indexes i, user_ind_columns c
  6   where c.index_name=i.index_name
  7*  and c.table_name=upper('&table_name')
SQL> /
table_name의 값을 입력하십시오: emp
구   7:  and c.table_name=upper('&table_name')
신   7:  and c.table_name=upper('emp')

뷰가 생성되었습니다.

SQL> select * from v_index;

INDEX_NAME
------------------------------
COLUMN_NAME
--------------------------------------------------------------------------------
COLUMN_POSITION UNIQUENES
--------------- ---------
EMP_ENAME_IDX
ENAME
              1 NONUNIQUE

PK_EMP
EMPNO
              1 UNIQUE

INDEX_NAME
------------------------------
COLUMN_NAME
--------------------------------------------------------------------------------
COLUMN_POSITION UNIQUENES
--------------- ---------





4) INDEX 삭제

drop index emp_ename_idx;
인덱스가 삭제되었습니다.

SQL> select * from v_index;

INDEX_NAME
------------------------------
COLUMN_NAME
--------------------------------------------------------------------------------
COLUMN_POSITION UNIQUENES
--------------- ---------
PK_EMP
EMPNO
              1 UNIQUE











시컨스(sequence) 객채, 시노님(동의어)-> 사용권한에서 더 다룸



Q5. [ 시컨스(sequence) ]

특정 필드에 연결시켜서 데이터를 입력할 때, 자동적으로 지정한 번호를 넣어주는 역할을 하는 오라클 객체

*rownum과 유사 : 레코드 앞에 번호 부여하나 번호를 지정할 수 없음

- 특정필드 : primary key와 연결된 필드(중복 되지 않는 유일한 값)
- 수동 대신에 자동으로 입력, 편리성을 추구


형식)

CREATE SEQUENCE sequence_name(테이블명_필드명)
[START WITH n] // n-> 시작번호
[INCREMENT BY n] // n -> 증가치
[{MAXVALUE n | NOMAXVALUE}] // n 최대값 | nomaxvlue 무제한
[{MINVALUE n | NOMINVALUE}] // n 최소값 | 최소값을 설정하지 않는 경우
[{CYCLE | NOCYCLE}] // 순환유무 cycle 최대값을 도달한 이후 다시 시작번호부터 시작
[{CACHE n | NOCACHE}] // 메모리 저장 유무



EX1) defualt 시퀀스

SQL> create sequence b_emp4_empno;

시퀀스가 생성되었습니다.

-> defualt가 적용, 자동으로 1부터 시작하여 증가치도 1
-> 시작번호나 증가치를 지정하고 싶은 경우 옵션 명령문 활용(start with~)





EX2) 시퀀스 속성

create sequence b_dept2_deptno;
시퀀스가 생성되었습니다.

-> deptno 대신에 정해준 번호를 자동으로 입력하려는 경우, 시퀀스 속성을 활용



[ 시퀀스 속성] 

1) currval : 현재값을 반환(현재 설정된 값), 즉 현재 설정된 값을 확인

2) nextval : 현재 지정된 시퀀스 값의 다음값을 반환, 즉 다음 증가할 값을 얻는다

3) 시퀀스명.속성명(currval of nexval)


select b_dept2_deptno.currval from dual;

1행에 오류:
ORA-08002: 시퀀스 B_DEPT2_DEPTNO.CURRVAL은 이 세션에서는 정의 되어 있지
않습니다

-> 시퀀스를 생성하고 바로 현재값(currval)을 확인할 수 없음
-> 현재 시퀀스에 설정된 값이 저장이 되어있지 않기 때문에 오류 발생
-> 즉, 시퀀스 생성시 반드시 nextval을 설정

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1* select b_dept2_deptno.nextval from dual
SQL> /

   NEXTVAL
----------
         1

-> 지정된 값의 다음 값을 얻는다

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1* select b_dept2_deptno.currval from dual
SQL> /

   CURRVAL
----------
         1

-> 현재 지정된 값을 확인

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1* select b_dept2_deptno.nextval from dual
SQL> /

   NEXTVAL
----------
         2

-> 현재 값인 1의 다음 값인 2을 얻는다





EX3) 테이블에 어떻게 적용시켜서 사용할 것인가?

1) 테이블 값 확인하기

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU


-> insert : 60, 60부터 입력이 되어야함
-> 시퀀스의 시작값은 60, 증가치는 10


2) insert

select into b_dept2 values(60,'TESTING','SEOUL')

-> 입력시, DEPTNO가 중복될수 있음
-> 시퀀스를 입력하여 자동으로 입력

select into b_dept2 values(b_dept2_deptno.nextval,'TESTING','SEOUL')

-> 시퀀스를 대입




EX4) 새로운 시퀀스 생성하기

1) 시퀀스 생성

SQL> create sequence b_dept2_deptno2
  2   start with 60 // 시작값
  3   increment by 10 // 증가치 값
  4   maxvalue 10000 // 최대값
  5   nocycle  // 순환유무
  6   nocache; // 저장유무

시퀀스가 생성되었습니다.



2) 시퀀스 설정

SQL> insert into b_dept2 values(b_dept2_deptno2.nextval,'TESTING','SEOUL');

1 개의 행이 만들어졌습니다.

SQL> insert into b_dept2 values(b_dept2_deptno2.nextval,'TESTING2','BUSAN');

1 개의 행이 만들어졌습니다.

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN

7 개의 행이 선택되었습니다.




시퀀스의 번호를 skip되는 경우

1) 시퀀스를 어려개의 테이블에 연결할 때
2) crash, down 되었을 경우
  -> 게시물 번호 -> 최대값+1





Q6. 시퀀스 : user_sequences에 저장된 것을 뷰를 이용하여 조회

1) user_sequences 구조 확인

SQL> desc user_sequences
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 SEQUENCE_NAME (내가 만든 시퀀스명)           NOT NULL VARCHAR2(30)
 MIN_VALUE (최소값 설정)                              NUMBER
 MAX_VALUE (최대값 설정)                              NUMBER
 INCREMENT_BY (증가치)                      NOT NULL NUMBER
 CYCLE_FLAG                                         VARCHAR2(1)
 ORDER_FLAG                                         VARCHAR2(1)
 CACHE_SIZE                                NOT NULL NUMBER
 LAST_NUMBER (현재 저장된 마지막 값)         NOT NULL NUMBER
             (=가장 최근에 저장된 값)
             


2) 뷰 생성

create view v_sequence_seq
 as
 select sequence_name, min_value, max_value, increment_by, last_number
 from user_sequences;

뷰가 생성되었습니다.

SQL> select * from v_sequence_seq;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
B_DEPT2_DEPTNO                          1 1.0000E+28            1          21
B_DEPT2_DEPTNO2                         1      10000           10          80
B_EMP4_EMPNO                            1 1.0000E+28            1           1





Q7. 시퀀스 수정하기

형식)

ALTER SEQUENCE sequence_name(테이블명_필드명)
[START WITH n] // n-> 시작번호
[INCREMENT BY n] // n -> 증가치
[{MAXVALUE n | NOMAXVALUE}] // n 최대값 | nomaxvlue 무제한
[{MINVALUE n | NOMINVALUE}] // n 최소값 | 최소값을 설정하지 않는 경우
[{CYCLE | NOCYCLE}] // 순환유무 cycle 최대값을 도달한 이후 다시 시작번호부터 시작
[{CACHE n | NOCACHE}] // 메모리 저장 유무



1) 시퀀스 수정

alter sequence b_dept2_deptno2
 increment by 2 
 maxvalue 23
 minvalue 1
 nocycle
 nocache;

1행에 오류:
ORA-04009: MAXVALUE 에 현재치보다 작은 값을 지정할 수 없습니다

-> maxvalue 값을 설정할 때 현재값보다 작은 값을 설정할 수 없다.



[시퀀스(currval, nextval) ]을 사용할수 없는 경우]

1) veiw의 select 절 : view절 구문 내 사용 불가

2) distint 키워드가 있는 slecet문

3) order by 절 : 그룹함수 사용 시

4) select, delete, update의 서브쿼리

5) create table, alter table의 명령과 defualt 값



2) 시퀀스 삭제

drop sequence 삭제시킬 시퀀스명

SQL> drop sequence b_dept2_deptno2;

시퀀스가 삭제되었습니다.

SQL>  select * from v_sequence_seq;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
B_DEPT2_DEPTNO                          1 1.0000E+28            1          21
B_EMP4_EMPNO                            1 1.0000E+28            1           1






'Oracle' 카테고리의 다른 글

사용권한 : 시스템 권한(Lock, Role)  (0) 2017.06.16
동의어(synonym) ★  (0) 2017.06.16
TCL 트랜잭션(commit, rollback, savepoint)  (1) 2017.06.16
뷰 veiw 생성/삭제/수정  (0) 2017.06.16
집합연산자  (0) 2017.06.16
Comments