오늘은 SQL에서 지원해 주는 객체에 대해서 포스팅해보려 합니다.
■ 뷰(View)
SQL에서 뷰(view)는 다른 테이블에서 파생된 테이블을 의미합니다. 하지만 물리적으로 데이터가 저장되는 것이 아니라 논리적으로만 존재하며, 뷰(view)를 사용한 질의 시에는 DBMS(DB 관리 시스템)에서 뷰의 정의를 잘 파악하고 필요시 재 작성하여 수행해야 합니다.
뷰의 장단점은 다음과 같습니다.
1 ) View의 장단점
장점
- 논리적 데이터 독립성을 제공합니다.
- 동일 데이터에 대해 동시에 여러사용자의 상이한 응용이나 요구를 지원해 줍니다.
- 사용자의 데이터관리를 간단하게 해줍니다.
- 접근 제어를 통한 자동 보안이 제공됩니다.
단점
- 독립적인 인덱스를 가질 수 없습니다.
- ALTER VIEW문을 사용할 수 없습니다. 즉, 뷰의 정의를 변경할 수 없습니다.
- 뷰로 구성된 내용에 대한 삽입, 갱신, 연산에 제약을 가집니다.
2 ) 필요성
- 사용자마다 특정 객체만 조회할 수 있도록 할 필요가 있다.
(모든 직원에 대한 정보를 모든 사원이 볼 수 있도록 하면 안 됨. 접근성!)
- 복잡한 질의문을 단순화할 수 있습니다.
- 데이터의 중복성을 최소화할 수 있습니다.
3 ) view 생성
create문을 사용하여 뷰를 생성할 수 있습니다.
--뷰 생성
create view test_v
as
select*from emp
where 조건;
뷰의 이름을 명시하고, as 키워드 다음에 select문을 사용하여 해당 뷰가 접근할 수 있는 필드를 명시합니다.
이때 where절을 사용하여 특정 조건을 설정할 수도 있습니다.
※ 뷰는 원본 테이블과 같은 이름을 가질 수 없습니다.
그럼 예제를 통해서 알아봅시다.
다음 예제는 원본 테이블에서 뷰를 생성하고 where절에 조건을 추가했습니다.
<예제 1>
create or replace view test_view
as
select empno, ename, e.deptno, dname
from emp e, dept d
where e.deptno = d.deptno;
뷰가 생성이 되었으니, 조건에 알맞게 생성이 되었는지 확인해 봅시다.
<예제 2>
select*from test_view;
위 결과를 보면 조건에 알맞게 출력된 걸 확인할 수 있습니다.
실무에서 작업을 하다 보면 가끔 테이블인지 뷰인지 확인이 안 될 때가 있는데 확인 방법은 tab으로 가능합니다.
<예제 3>
--테이블인지 뷰인지 확인
select*from tab;
또한, 뷰의 세부정보를 확인을 하고 싶으면 user_views;로 정보를 확인할 수도 있습니다.
<예제 4>
--뷰에 세부정보 확인
select*from user_views;
■ 색인(Index)
색인(index)이란 검색 속도를 높이기 위해 사용하는 하나의 기술입니다.
해당 테이블의 칼럼을 색인화하여 검색 시 해당 테이블의 레코드를 FULL SCAN 하는 게 아니라 색인화되어 있는 인덱스 파일을 검색하여 검색을 빠르게 합니다. 즉, 테이블의 데이터를 보다 빠르게 검색할 수 있도록 지원해 주는 객체입니다.
색인(index) 장단점은 다음과 같습니다.
장점
- 키값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상 시킵니다.
- 질의나 보고서에서 그룹화 작업의 속도를 향상 시킵니다.
- 테이블행의 고유성을 강화할 수 있습니다.
- 여러 필드로 이루어진 색인(index)을 사용하면 첫 필드 값이 같은 레코드도 구분할 수 있습니다.
단점
- 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어듭니다.
- 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해집니다.
- 인덱스를 생성하는데 시간이 많이 소요될 수 있습니다.
1 ) index 구성 요소
<구성 요소>
--rowid(레코드 주소값) - 의사컬럼
select rowid, empno, ename from emp;
예제를 통해서 좀 더 자세히 알아봅시다.
인덱스 생성은 다음과 같습니다.
<예제 5>
--인덱스 생성
--create index 인덱스명 on 테이블명(컬럼명,...)
--primary key, unique 제약조건을 만들면 해당 인덱스가 자동으로 생성됨
create index c_emp_name_idx on c_emp(name);
--인덱스 삭제
drop index c_emp_name_idx;
※ 인덱스 삭제를 하고 싶을 땐 drop문을 사용하시면 됩니다.(view도 동일합니다.)
그럼 인덱스 처리를 해봅시다.
<예제 6>
--인덱스 처리
--sql deverloper : F10 실행계획 보기
--full scan : 모든 레코드를 검사
--index unique scan : 유일한 값(pk , un등에 index 처리되었을 때)
--index range scan : 유일하지 않은 값(동명이인이 있을 수 있는 이름데이터가 들어가는 컬럼에 index 처리되었을 때)
select empno, ename from emp
where empno = 7900;
select empno, ename from emp
where ename = '송기성';
■ 시퀀스(Sequence)
시퀀스(Sequence)란 자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체입니다. 보통 PK값에 중복값을 방지하기 위해 사용합니다. (예) 은행 번호표처럼 후진은 안됨), mySQL의 auto_increment와 같은 기능입니다.
1 ) 시퀀스(Sequence) 생성
<생성>
create sequence 시퀀스이름
[increment by 숫자]
[start with 숫자]
[maxvalue 숫자]
[minvalue 숫자]
[cycle | nocycle] -- 일련번호 순환여부 (1~10, 1~10,…계속 순환)
[cache | nocache] -- 빠른 처리를 위해 시퀀스의 값을 메모리에 저장, 단,
cache를 사용하면 서버를 껐다가 키는 등의일을 하면 100번까지 발급되었다가
다음 101번부터 발급
그럼 예제를 통해서 알아봅시다.
시퀀스 생성은 다음과 같습니다.
<예제 7>
create sequence c_emp_seq --시퀀스이름 c_emp_seq
increment by 1 --증감숫자 1
start with 1 --시작숫자 1
maxvalue 1000 -- 최대값 1000
nocache --순환 거부
nocycle; --- 빠른 처리를 위해 시퀀스의 값을 메모리에 저장, 단,
cache를 사용하면 서버를 껐다가 키는 등의일을 하면 100번까지 발급되었다가
다음 101번부터 발급
생성 후 호출 방법은 nextval, currval로 호출이 가능합니다. nextval은 다음값을 반환시켜 주고, currval은 현재값을 반환해 줍니다.
예제를 통해서 알아봅시다.
<예제 8>
--시퀀스 호출
-- 1) nextval : 다음값을 변환
select c_emp_seq.nextval from dual;
-- 2) curvral : 현재값을 반환
select c_emp_seq.currval from dual;
마치며
오늘은 View_Index_Sequence에 대해서 알아봤습니다.
다음 포스팅으로 뵙겠습니다.
'[ SQL ] > SQL' 카테고리의 다른 글
[ H2 ] 윈도우 H2 데이터베이스 h2.bat 실행 오류 (2) | 2023.05.14 |
---|---|
[ SQL ] 고급 함수 (0) | 2023.02.02 |
[ SQL ] 테이블과 제약 조건(constraint) (2) | 2023.01.31 |
[ SQL ] Transaction and Sub Query (0) | 2023.01.30 |
[ SQL ] JOIN (2) | 2023.01.22 |