[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] VIEW, INDEX, SEQUENCE

MinHee·2023년 5월 20일
0
post-thumbnail

VIEW

VIEW를 사용하는 이유 : 보안

VIEW
특정 테이블에 대해서 일부 데이터만 볼 수 있도록 해주는 것
다른 데이터를 못 보게 할 때 사용 (개인정보 보안)
실제 데이터를 가지고 있지 않고(복사의 형태가 아님), 테이블의 데이터를 바라보고 있음 (포인터와 비슷한 느낌..?)

CREATE VIEW 뷰이름
AS (서브쿼리절);

CREATE VIEW emp_view
AS
(SELECT empno, ename, sal, job, deptno
FROM emp
WHERE job = 'SALESMAN');

SELECT * FROM emp_view;

VIEW에 대해서 데이터 수정을 할 경우, 원본 테이블의 값도 변경이 됨

VIEW

VIEW를 사용하는 이유 : 복잡한 쿼리문을 간단하게 검색하고자 할때

자주 실행되는 쿼리문의 결과를 view로 미리 생성해놓고, 해당 뷰의 전체를 출력하는 쿼리문을 실행
복잡한 쿼리문을 매번 작성하여 실행할 필요없이, 뷰만 조회하면 확인 가능함 - 쿼리문이 간결해짐

CREATE VIEW emp_view2
AS
(SELECT deptno, round(avg(sal)) AS avgsal -- 칼럼 별칭을 반드시 지정해줘야 함
FROM emp
GROUP BY deptno);

select * from emp_view2;

INDEX : 데이터 검색 속도를 높이기

CREATE INDEX 인덱스명
ON 테이블명(기준 칼럼명);

대용량 테이블에 대해서 쿼리를 빠르게 하기 위해 필요
책의 목차와 같은 느낌...?

객체 : TABLE, VIEW, INDEX

인덱스가 없다면 정렬되지 않은 칼럼 값에 대해서 조건에 일치하는 행을 찾아야함(전체를 읽어야 함) - 검색 성능이 느려짐

인덱스
인덱스 기준 데이터와 그와 일치하는 테이블의 행의 위치를 찾을 수 있는 인덱스가 저장된 인덱스 테이블이 존재함
인덱스 테이블의 데이터는 정렬된 데이터로, 빠르게 해당 값을 찾을 수 있음.
인덱스 테이블 내의 해당 값을 찾아서 ROWID를 기준으로 테이블 내의 행의 위치를 찾아감

인덱스가 없을 시 FULL TABLE SCAN을 하게 되는 것에 비해 매우 빠른 검색 성능을 보임

CREATE INDEX empsal -- 인덱스명은 의미 있게 : '테이블명기준칼럼명'
ON emp(sal);

rowid란 칼럼은 원래 테이블에 존재함, 쿼리문 작성 시에 rowid 칼럼을 명시해줘야지 확인 가능
rowid : row의 물리적인 주소 (file 번호 + 블럭 번호 + row 번호)

rowid는 테이블, 인덱스에 존재함

월급에 걸린 인덱스를 확인하고 싶으면 아래와 같이 작성함

SELECT sal, rowid
FROM emp
WHERE sal >= 0; -- 숫자의 경우 ">= 0" / 문자의 경우 "> ' '"

order by 절이 없음에도, sal칼럼이 오름차순으로 정렬되어있음

SEQUENCE : 절대로 중복되지 않는 번호 생성하기

CREATE SEQUENCE 시퀀스명; -- 옵션없이 생성
CREATE SEQUENCE seq1;

데이터를 입력할 시 특정 칼럼에 입력되는 순서대로의 번호를 입력하고 싶을 때 사용

SELECT seq1.nextval
FROM dual;

연속하여 실행할수록 1씩 증가한 값을 출력함

CREATE SEQUENCE 시퀀스명
INCREMENT BY 증감숫자
START WITH 시작문자
NOMINVALUE OR MINVALUE 최솟값
NOMAXVALUE OR MAXVALUE 최댓값
CYCLE OR NOCYCLE
CACHE OR NOCACHE -- 메모리에 시퀀스 값을 미리 할당

CREATE SEQUENCE seq2
START WITH 1
MAXVALUE 100
INCREMENT BY 1 -- 1부터 1씩 증가해서 최댓값 100까지
NOCYCLE; -- 100까지 나온 이후에 1로 다시 부여하지 않고, 끝내겠다는 의미

100을 넘어갈 시에 'NEXTVALUE EXCEEDS MAXVALUE는 사례로 될 수 없습니다'라는 오류 발생

CREATE SEQUENCE dept_seq1
START WITH 50
INCREMENT BY 10; -- 50부터 시작하고 10씩 증가하는 시퀀스 생성

profile
성장하는 개발자

0개의 댓글