day06 DBMS 마지막

전영덕·2023년 2월 15일
0

DBMS

목록 보기
6/7

1. 뷰(View)란?

  • 하나의 가상 테이블이라고 생각
  • 작업시 자주 조회하는 데이터들이 있다. 한 테이블에 데이터가 있으면 조회하기 편하겠지만 그렇지 않은 경우가 있다.
  • 여러 테이블을 join사용하여 가져오고 쿼리가 복잡한 경우도 있다.
  • 이런 경우 쿼리로 뷰를 만들어 넣고 사용하면 편리하다.
  • 보안에도 유리하다. 테이블에 data를 노출시키고 싶지 않을 때, 뷰를사용하여 제공할 수 있다. employees테이블을 예로 들면 이 정보를 외주를 맡길때 급여나 핸드폰 번호같은 개인정보 같은 것들은 주면 안된다. 뷰 를 통해 넘겨도 되는 정보만 선택적으로 외주회사한테 넘길 수 있다.

1-1. 뷰의 사용 목적

  • 뷰를 만들어 놓으면 복잡한 쿼리를 쉽게 작성가능하다.
  • 원하는 컬럼만 공개하여 원천데이터 테이블 비공개 가능성, 보안에도 유리하다.

1-2. 뷰의 특징

  • 원천데이터가 변경되면 view 데이터도 자동으로 변경
  • 뷰의 검색은 자유로우나, 삽입, 수정, 삭제는 제약이 있다.
  • 뷰생성 쿼리에 함수를 사용하면 반드시 alias를 지정.
SELECT * FROM EMP_DETAILS_VIEW edv ;


CREATE VIEW v_emp(emp_id, first_name, job_id, hiredate, dept_id) as
SELECT 	EMPLOYEE_ID ,	FIRST_NAME
	,	JOB_ID 		,	HIRE_DATE 
	,	DEPARTMENT_ID 
FROM 	EMPLOYEES e 
WHERE 	JOB_ID = 'ST_CLERK'
WITH READ ONLY 
;
SELECT * FROM v_emp;
-- 함수로 작성된 부분은 수정 불가
-- 125
UPDATE V_EMP SET FIRST_NAME = 'kim' WHERE FIRST_NAME = 'Julia';
SELECT * FROM EMPLOYEES e WHERE EMPLOYEE_ID = 125;
UPDATE EMPLOYEES SET FIRST_NAME = 'Julia' WHERE EMPLOYEE_ID = 125;

--DROP VIEW V_EMP ;


SELECT * FROM EMPLOYEES;

2. 시퀀스(Sequence)

  • 연속적인 번호를 만들어주는 기능
  • 시퀀스란 자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체이다.
  • 보통 pk값에 중복값을 방지하기 위해 사용한다.
-- sequence
CREATE SEQUENCE seq_serial_no
INCREMENT BY 1					-- INCREMENT BY  : 증가 값 
START WITH 100					-- START WITH 	: 시작 값
MAXVALUE 110					-- MAXVALUE 	: 최대 값/ NOMAXVALUE 
MINVALUE 99						-- MINVALU		: 최소값
CYCLE						-- CYCLE : maxvalue에 도달시 다시 minvalue로 돌아간다.
							-- 			NOCYCLE (기본값)
cache 2						-- cache : 메모리 보관 값
;

CREATE TABLE good(
	good_no		number(3),
	good_name	varchar2(10)
);
SELECT * FROM GOOD;
INSERT INTO GOOD VALUES (seq_serial_no.nextval, '제품13');
INSERT INTO GOOD VALUES (seq_serial_no.currval, '제품14');

SELECT seq_serial_no.currval FROM DUAL ;

DROP SEQUENCE seq_serial_no;

3. index

3-1. 인덱스란

  • 조회속도를 향상시키기 위한 데이터베이스 검색 기술
  • 색인이란 뜻으로 해당테이블의 조회결과를 빠르게 하기 위해 사용
  • DB가 커야 체감이되며, PK값으로 조회를 하는것이 제일 좋고 빠르다.

3-2. index원리

  • 인덱스를 테이블의 특정 컬럼에 한 개 이상 주게되면 inde table이 따로 만들어지고, 인덱스 컬럼의 row 값과 rowid값이 저장되며 row 값은 정렬된 트리 구조로 저장시켜 두었다가 검색시 좀 더 빠르게 해당데이터를 찾늗네 도움을준다.
  • 하지만 DML명령을 사용할 때는 원본 table은 물론 index table에도 데이터를 갱신시켜주어야 하기 떄문에 update, insert, delete명령을 쓸 때 속도가 느려진다는 단점이 있다.
  • select를 많이 쓰이게 되는 row에 인덱스를 쓰는게 좋다.

3-3. 인덱스 생성이 불필요한 경우

  • 데이터가 적은 경우(수천건)에는 인덱스를 설정하지 않는게 오히려 성능에 좋다.
  • 조회보다 삽입, 수정, 삭제처리가 많은 테이블

3-4. DML명령어를 이용했을 경우의 취약점

  • insert : 두 개의 테이블에 동시 insert
  • delete : 인덱스 에서는 데이터를 사용하지 않음으로 표시하고 지우지 않는다.
  • update : 인덱스 에서는 delete한 후 새로운 data를 insert한다.

3-5. index 생성

  • unique index : 인덱스를 사용한 칼럼의 중복값들을 포함하지 않고 사용할 수 있는 장점이 있다.
    create unique index 인덱스명 on 테이블명(칼럼);
  • non-unique index : 인덱스를 사용한 칼럼에 중복데이터 값을 가질 수 있다.
    create index인덱스명
    on 테이블명(칼럼);
CREATE TABLE EMPLOYEES3 AS SELECT * FROM EMPLOYEES e ;
SELECT * FROM EMPLOYEES3;

SELECT  *
FROM 	EMPLOYEES3 e
ORDER BY EMPLOYEE_ID 
;

INSERT INTO EMPLOYEES3 (employee_id, FIRST_NAME, LAST_NAME)
VALUES	(502, 'Ismeal', 'Chen');

-- unique index 생성
CREATE UNIQUE INDEX idx_employee3_id
ON EMPLOYEES3(employee_id);

DELETE FROM EMPLOYEES3 e
WHERE 	FIRST_NAME = 'Ismeal'
AND 	LAST_NAME = 'Chen'
;

-- index 생성
CREATE INDEX idx_employee3_first
ON EMPLOYEES3(first_name);

SELECT * FROM EMPLOYEES3 e ORDER BY EMPLOYEE_ID DESC ;

0개의 댓글