본문 바로가기
[ SQL ]/SQL

[ SQL ] View_Index_Sequence

by 환이s 2023. 2. 1.
728x90

오늘은 SQL에서 지원해 주는 객체에 대해서 포스팅해보려 합니다.

 

 

■ 뷰(View)

 

SQL에서 뷰(view)는 다른 테이블에서 파생된 테이블을 의미합니다. 하지만 물리적으로 데이터가 저장되는 것이 아니라 논리적으로만 존재하며, 뷰(view)를 사용한 질의 시에는 DBMS(DB 관리 시스템)에서 뷰의 정의를 잘 파악하고 필요시 재 작성하여 수행해야 합니다.

 

뷰의 장단점은 다음과 같습니다.

 

1 ) View의 장단점

 

장점

 

  1. 논리적 데이터 독립성을 제공합니다.
  2. 동일 데이터에 대해 동시에 여러사용자의 상이한 응용이나 요구를 지원해 줍니다.
  3. 사용자의 데이터관리를 간단하게 해줍니다.
  4. 접근 제어를 통한 자동 보안이 제공됩니다.

단점

 

  1. 독립적인 인덱스를 가질 수 없습니다.
  2. ALTER VIEW문을 사용할 수 없습니다. 즉, 뷰의 정의를 변경할 수 없습니다.
  3. 뷰로 구성된 내용에 대한 삽입, 갱신, 연산에 제약을 가집니다.

 

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) 장단점은 다음과 같습니다.

 

장점

 

  1. 키값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상 시킵니다.
  2. 질의나 보고서에서 그룹화 작업의 속도를 향상 시킵니다.
  3. 테이블행의 고유성을 강화할 수 있습니다.
  4. 여러 필드로 이루어진 색인(index)을 사용하면 첫 필드 값이 같은 레코드도 구분할 수 있습니다.

단점

 

  1. 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어듭니다.
  2. 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해집니다.
  3. 인덱스를 생성하는데 시간이 많이 소요될 수 있습니다.

 

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에 대해서 알아봤습니다.

다음 포스팅으로 뵙겠습니다.

728x90

'[ 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