C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/기본]13. 다른 데이터베이스 객체 본문
● 데이터베이스 객체
- Table : 행과 열로 구성된 기본적인 저장매체의 단위
- View : 하나 이상의 테이블로부터 데이터의 부분집합을 논리적으로 표현
- Sequence : 기본 키 값을 발생
- Index : 어떤 질의의 성능을 향상
- Synonym : 객체에 대체 이름을 부여
● 시퀀스
- 자동적으로 유일번호를 생성한다.
- 공유가능한 객체(다중 테이블에 대해 사용될 수 있다.)
- 주로 기본 키 값을 생성하기 위해 사용된다.
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n / NONMAXVALUE}]
[{MINVALUE n / NONMINVALUE}]
[{CYCLE / NONCYCLE}]
[{CACHE n / NOCACHE}];
sequence 시퀀스의 이름이다.
INCREMENT BY n 정수 값인 n으로 시퀀스 번호 사이의 간격을 지정한다.
START WITH n 생성하기 위해 첫번째 시퀀스를 지정한다. 이 절이 생략되면, 시퀀스는 1로 시작된다.
MAXVALUE n 시퀀스를 생성할 수 있는 최대값을 지정한다.
NONMAXVALUE 오름차순용 10^27 최대값과 내림차순용 -1의 최소값을 지정한다.
MINVALUE n 최소 시퀀스 값을 지정한다.
NONMINVALUE 오름차순용 1과 내림차순용 -(10^26)의 최소값을 지정한다.
CYCLE / NOCYCLE 최대 또는 최소값에 도달한 후에 계속 값을 생성할 지의 여부를 지정한다. NOCYCLE이 디폴트 옵션이다.
CACHE n / NOCACHE 얼마나 많은 값을 메모리에 오라클 서버가 미리 할당하고 유지하는가를 지정한다. 디폴트로 오라클 서버는
20을 캐쉬한다.
Ex. CREATE SEQUENCE 시퀀스명
INCREMENT BY 1
START WITH 91
MAXVALUE 100
NOCACHE
NOCYCLE;
시퀀스 사이클보다 더 빨리 오래된 행을 지우는 신뢰할만한 메커니즘을 가지고 있지 않은 경우에, 기본 키 값을 생성하기 위해 시퀀스가
사용된다면 CYCLE 옵션을 사용해서는 안된다.
● NEXTVAL과 CURRVAL
- NEXTVAL : 다음 사용 가능한 시퀀스 값을 반환
- CURRVAL : 현재 시퀀스 값을 얻는다.
INSERT INTO dept(deptno, dname, loc)
VALUES (dept_deptno.NEXTVAL, 'MARKETING', 'SAN DIEGO');
SELECT dept_deptno.CURRVAL
FROM dual;
● 시퀀스 사용
- 시퀀스 값에서 간격(gap)은 아래 상황에서 발생할 수 있다.
☞ rollback 발생
☞ system실패(crash)
☞ 시퀀스가 다른 테이블에서 사용될 때
- USER_SEQUENCES 테이블을 질의하여 NOCACHE로 시퀀스가 생성된 경우에만 증가 없이 다음 사용 가능 값을 볼 수 있다
● 시퀀스 수정
시퀀스에 대해 MAXVALUE한계에 도달한다면, 더이상 시퀀스 값을 할당 받을 수 없다. 시퀀스를 계속 사용하기 위해, ALTER SEQUENCE
문장을 사용하여 수정할 수 있다.
ALTER SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n / NONMAXVALUE}]
[{MINVALUE n / NONMINVALUE}]
[{CYCLE / NOCYCLE}]
[{CACHE n / NOCACHE}];
- START WITH옵션은 ALTER SEQUENCE를 사용하여 변경될 수 없다. 다른 번호에서 시퀀스를 다시 시작하기 위해서는 제거하고 다시
생성되어야 한다.
- 유효성 검사를 수행한다. 예를 들면, 새 MAXVALUE는 현재 시퀀스 번호보다 작게 될 수 없다.
● 시퀀스 제거
DROP SEQUENCE dept_deptno;
● 인덱스
- 포인터를 사용하여 행의 검색을 촉진할 수 있는 스키마 객체이다.
- 열에서 인덱스를 가지고 있지 않다면, 이 때는 전체 테이블 스캔이 발생한다.
● 인덱스를 생성하는 방법
1. 자동으로
유일 인덱스는 테이블 정의의 PRIMARY KEY 또는 UNIQUE KEY 제약조건을 정의할 때 자동으로 생성된다.
2. 수동으로
사용자는 행에 대한액세스 시간을 향상 시키기 위해 열에서 유일하지 않은 인덱스를 생성할 수 있다.
- 인덱스 생성
CREATE INDEX index
ON table (col1, col2, ...);
Ex. CREATE INDEX emp_ename_idx
ON emp(ename);
● 언제 인덱스를 생성하는가?
1. 열은 WHERE절 또는 조인 조건에서 자주 사용된다.
2. 열은 광범위한 값을 포함한다.
3. 열은 많은수의 NULL값을 포함한다.
4. 둘 또는 이상의 열은 WHERE절 또는 조인 조건에서 자주 함께 사용된다.
5. 테이블은 대형이고 대부분의 질의들은 행의 2 ~ 4% 보다 적게 읽어들일 것으로 예상된다.
● 언제 인덱스를 생성해서는 안되는가?
1. 테이블이 작다.
2. 열이 질의의 조건으로 자주 사용되지 않는다.
3. 대부분의 질의들은 행의 2 ~ 4%이상을 읽어들일 것으로 예상된다.
4. 테이블은 자주 갱신된다. 테이블에 하나 이상의 인덱스를 가지고 있다면 테이블을 액세스하는 DML 문장은 인덱스의 유지
때문에 상대적으로 더 많은 시간이 걸리게 된다.
● 인덱스 제거
DROP INDEX index;
인덱스는 수정할 수 없다.
인덱스를 변경하기 위해서는, 그것을 제거하고 다시 작성해야한다.
● 동의어
동의어(객체의 다른이름)를 생성하여 객체에대한 액세스를 단순화한다.
- 다른 사용자가 소유한 테이블을 참조한다.
- 개체이름의 길이를 단축한다.
CREATE [PUBLIC] SYNONYM synonym
FOR object;
PUBLIC 모든 사용자에 대해 액세스 가능한 동의어를 생성한다.
synonym 생성되어야 할 동의어의 이름이다.
object 생성된 동의어에 대한 객체를 식별한다.
Ex. DEPT_SUM_VU 뷰에 대해 단축명을 생성한다.
CREATE SYNONYM dm_sum
FOR alice.dept_sum_vu;
위와같이 시노님을 작성했을 경우, 아래의 결과는 같다.
SELECT * FROM dm_sum; <-동의어 사용
SELECT * FROM alice.dept_sum_vu;
동의어를 제거한다.
DROP SYNONYM d_sum;
[PUBLIC] 이 들어간 공용동의어의 경우 DBA만 제거할 수 있다.
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/기본]15. SQL 제약조건 별 CREATE TABLE 예제. (0) | 2017.05.31 |
---|---|
[Oracle/기본]14. 사용자 접근 제어 (0) | 2017.05.24 |
[Oracle/기본]12. 뷰 생성 (0) | 2017.05.23 |
[Oracle/기본]11. 제약조건 포함 (0) | 2017.05.23 |
[Oracle/기본]10. 테이블 생성과 관리 (0) | 2017.05.23 |