10. 시퀸스, 인덱스, 뷰
1. SEQUENCE
- 연속적인 숫자를 생성해내는 객체
- 기본키가 각각의 입력되는 row를 식별할 수 있기만 하면 된다고 할 때
- 시퀀스에 의해 생성된 값 아용
- 테이블의 기본키 값을 생성하기 위해 사용되는 독립적인 객체
- 테이블에 종속되지 않는다
- 하나의 시퀀스를 여러개의 테이블에 동시에 사용 가능
create sequence "스키마명.시퀀스명"
minvalue -- 시작숫자
maxvalue -- 끝 숫자
increment by -- 증가 단위
start with -- 시퀀스 생성이 시작되는 값
nocache
noorder -- order 요청되는 순서대로 값을 생성
nocycle; -- cycle 최대치에 다다랐을 때 초기값부터 다시 시작할 지
--시퀀스 생성
create sequence pd_temp1_seq
increment by 1
start with 50 --50부터 시작해서 1씩 증가
nocache;
--이용
insert into pd_temp1(no,pdname,price,regdate)
values(pd_temp1_seq.nextval, '컴퓨터',1200000,sysdate);
NO PDNAME PRICE REGDATE
---------- -------------------------------------------------- ---------- -----------------
50 컴퓨터 1200000 22/03/28 10:01:32
- 생성한 시퀀스 확인
select * from user_sequences;
- 의사컬럼
- nextval : 다음에 생성될 시퀀스를 가지고 있다
- currval : 현재 시퀀스 값을 가지고 있다
select pd_temp1_seq.currval from dual;
select pd_temp1_seq.nextval from dual; - nextval 조회할 때마다 시퀀스 번호가 증가
2. INDEX
- 테이블의 데이터를 빨리 찾기 위한 꼬리표
- 인덱스가 없다면 특정한 값을 찾기 위해 모든 데이터 페이지를 검색해야 한다
- table full scan
- index seek
- 오라클은 모든 페이지를 검색하지 않고 인덱스 페이지를 찾아 쉽게 데이터를 가져온다
생성
- 인덱스의 생성
- 컬럼을 지정하여 만들 수 있다
- 테이블의 생성과 동시에 생성은 불가
- 테이블과 별도의 오브젝트로써 테이블과 동등한 레벨의 객체
- 한 테이블에 여러개의 인덱스 생성 가능
create (unique) index 인덱스명 on 테이블명(컬럼1,~);
- 컬럼을 지정하여 만들 수 있다
create unique index idx_pd2_pdcode
on pd2(pdcode); --단일인덱스
create index idx_pd2_pdname
on pd2(pdname);
create index idx_pd2_regdate_company
on pd2(regdate,company); --복합인덱스
--인덱스 조회
select * from user_indexes
where table_name = 'PD2';
--인덱스를 이용한 조회
select * from pd2
where pdcode='B01';
종류
- 유일성 여부에 따라
- 단일 인덱스 : 인덱스가 한개의 컬럼에 있을 경우
- 복합 인덱스 : 인덱스가 두개 이상의 컬럼에 있을 경우
- where 절에 사용되는 컬럼 순으로 인덱스 구성
- 구성 컬럼 개수에 따라
- unique 인덱스 : unique 옵션이 주어지는 것
- 해당 컬럼에 입력되는 값은 유일해야 한다
- unique나 기본키 생성시 unique 인덱스 자동 생성
- non unique 인덱스 : unique옵션이 주어지지 않은 것
- unique 인덱스 : unique 옵션이 주어지는 것
- 인덱스 생성자에 따라
- 수동 인덱스 : create index문을 사용하여 생성
- 자동 인덱스 : unique키나 기본키 생성에 따라 자동으로 생성
가이드라인
- 데이터 변경이 일어나면 오라클이 인덱스 정보를 자동으로 변경
- 인덱스가 너무 많으면 성능 문제 발생
- 인덱스를 통한 검색
- 인덱스 정보를 검색 후 검색 된 인덱스가 가리키는 데이터 조회
- 가이드라인
- 자주 조회되는 컬럼을 인덱스 컬럼으로 선택
- 외래키가 있는 컬럼에 생성
- 조인의 속도 향상
- 테이블 전체 row가 적은 경우 인덱스 불필요
- 복합 인덱스 구성 시 컬럼의 순서
- where 절에서 좀더 자주 사용되는 컬럼을 먼저 오게 한다
- long, long raw 타입 컬럼은 인덱스 불가
- 삽입, 갱신, 삭제가 빈번한 테이블에는 인덱스를 많이 만들지 않는다 ***
3. VIEW
- 테이블에 있는 데이터를 보여주는 형식을 정의하는 select 문장의 덩어리
- 실제로 데이터는 가지고 있지 않다
- 뷰를 통해 데이터 조회 가능
- 데이터 입력 수정 삭제 가능
- 가상의 논리적인 테이블
- 이미 존재하는 테이블에서 원하는 데이터만 가져온다
- 미리 원하는 컬럼만 모아 가상적으로 만든 테이블
- 필요성
- 보안성
- 사용자들에게 테이블 엑세스 권한 제거
- 뷰를 통해 테이블 데이터 엑세스
- 숨기고싶은 컬럼을 숨기며, 원하는 컬럼만 보여줄 수 있다
- 사용자들에게 테이블 엑세스 권한 제거
- 편의성
- 복잡한 조회문장을 입력하지 않아도 된다
- 조인과 같은 문장을 작성하지 않고, 뷰를 통해 수월하게 질의
- 네트웍 트래픽을 줄일 수 있다
- 보안성
- 종류
- read only 뷰 : 조회만 가능
create (or replace) view (스키마이름.)뷰이름 as select 문장 with read only;
- updatable 뷰 : insert,update,delete 가능
create (or replace) view (스키마이름.)뷰이름 as select 문장;
- 테이블 개수에 따라
- 단일 뷰
- 조인 뷰
- read only 뷰 : 조회만 가능
--뷰 생성
create or replace view v_employees
as
select e.employee_id, e.first_name || '-' || e.last_name 이름,
e.hire_date, e.department_id, d.department_name,
e.salary + e.salary*nvl(e.commission_pct,0) 급여
from employees e left join departments d
on e.department_id = d.department_id;
--뷰 조회
select * from v_employees;
--뷰 생성
create or replace view v_gogak_info
as
select gno 고객번호, gname 이름,
case when substr(jumin,7,1) in (1,3) then '남'
else '여'
end 성별,
extract(year from(sysdate)) -
(substr(jumin,1,2) + case when substr(jumin,7,1) in (1,2) then 1900
else 2000
end) +1 나이
from gogak;
select * from v_gogak_info;
--뷰 이용 조회
select * from v_gogak_info
where 성별='여' and trunc(나이,-1) in(20,30);
- 뷰를 이용한 데이터 수정
--수정 가능 뷰
create or replace view v_emp
as
select ename,job,hiredate
from emp
where deptno in (20,30)
with read only;
--읽기 전용 뷰
create or replace view v_emp_readonly
as
select ename,job,hiredate
from emp
where deptno in (20,30)
with read only;
update v_emp_readonly
set ename = 'SMITH2'
where ename = 'SMITH'; --읽기전용 뷰 수정 불가 / SQL 오류: ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.
update v_emp
set ename = 'ALLEN2'
where ename = 'ALLEN'; -- 뷰에서 수정 시 원본데이터 수정
-- 뷰를 통해 입력할 경우, 뷰에 없는 컬럼은 null을 허용하거나 default 값이 있어야 한다
- 뷰의 범위를 벗어나는 데이터 수정
- 기본적으로 수정은 가능하나 조회는 불가
- 수정을 허용하지 않을 경우
- with check option
insert into v_emp2(empno,ename,job,hiredate)
values(9999,'홍길동','CLERK',sysdate); -- 기본적으로 뷰의 범위를 벗어나도 입력 가능
create or replace view v_emp_2
as
select empno,ename,job,hiredate
from emp
where deptno in (20,30)
with check option; --뷰의 범위를 벗어날 경우 수정 불가 옵션
insert into v_emp_2(empno,ename,job,hiredate)
values(9999,'홍길동','CLERK',sysdate); --error / ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다