Computing

[빅데이터 및 지식관리시스템] View에 대해 알아보기

ysk1m 2025. 3. 18. 14:20

View

View는 virtual table로 view자체가 데이터를 물리적으로 저장하지 않는다.

View는 실제 데이터가 들어 있는 Base Relation(기본 테이블) 위에 정의된다.

 

View에 대해 query를 날리면 DBMS가 내부적으로 Base Relation에 접근하여 결과를 생성한다.

CREATE VIEW HighScoreStudents(sid, gpa) AS SELECT S.sid, S.gpa FROM Students S WHERE S.gpa >3.5;

HighScoreStudents라는 View를 생성한다. 

구체적으로 S.gpa > 3.5일 경우에 대해 S.sid, S.gpa column을 보여준다.

 

View에 query를 날리는 과정을 살펴보자.

다음과 같이 query를 날렸다 하자.

SELECT S.sid FROM HighScoreStudents

DBMS이 자동으로 query를 재작성하여, Base Relation에 접근한다.

SELECT S.sid FROM Students S WHERE S.gpa >3.5;

 

View의 이점은 다음과 같다.

  • Data Independence: conceptual schema가 바뀌어도, external schema는 변하지 않는다. 예를 들어 Students base relation이 조금 바뀌어도, view는 여전히 같은 형태를 제공한다면 기존 프로그램이나 사용자는 변화를 인지할 필요가 없다.
  • Data Security: view를 통해 특정 조건을 만족하는 tuple만을 보이게 함으로써 민감한 정보를 숨길 수 있다.

Updates on View

View는 virtual table이기 때문에 base relation처럼 항상 INSERT, DELETE, UPDATE 같은 갱신 연산이 가능한 것은 아니다.

단일 table에서 생성된 view이거나 집계합수, GROUP BY, DISTINCT 등을 사용하지 않아야 한다.

 

join으로 구성된 뷰나 SUM, COUNT, AVG 등으로 계산된 칼럼은 원본 테이블의 어떤 튜플을 어떻게 업데이트해야 할지 알기 어렵기 때문이다.

 

Materialized Views

Materialized View는 일반 view와 다르게 물리적으로 저장하는 형태이다.

Stored View라고도 부른다.

 

특징

  • 반복해서 사용되는 복잡한 질의를 미리 계산해 둬, 질의응답 시간이 단축된다.
  • 물리적으로 저장해 놔야 하기 때문에 추가적인 저장 공간이 필요하다.
  • Indexing, partitioning 등 테이블과 유사한 관리가 가능하다.
  • 원본 데이터가 변경될 때, 동기화(REFRESH) 과정이 필요하다.

직접 구현을 해보면 다음과 같이 product_sales_mv라는 materialized View를 생성한다.

CREATE MATERIALIZED VIEW emp_aggr_mv

MV를 나중에 생성하거나 초기화할 수 있도록 할 수 있고 즉각 생성할 수도 있다.

BUILD DEFERRED
BUILD IMMEDIATELY

Refresh작업을 할때, 전체데이터를 다시 계산해서 채울지 또는 변경분만 갱신할지를 다음과 같이 지정할 수 있다.

REFRESH COMPLETE
REFRESH FAST

Refresh를 실시간으로 계속할 것인지, 수동으로 할 것인지도 정할 수 있다.

ON COMMIT
ON DEMAND

사용자가 base relation에 query를 직접 날려도 DBMS가 MV를 활용해 더 빠른 응답을 제공할 수 있게 한다.

ENABLE QUERY REWRITE

 

기본 세팅 다음으로 View를 refresh 하는 과정을 살펴보겠다.

emp_aggr_mv라는 materialized view를 만들어준다.

CREATE MATERIALIZED VIEW emp_aggr_mv
BUILD IMMEDIATE
REFRESH FORCE
ON DEMAND
ENABLE QUERY REWRITE
AS
SELECT deptno, SUM(sal) AS sal_by_dept
FROM emp
GROUP BY deptno;

 base relation인 emp를 다음과 같이 update 한다.

INSERT INTO emp VALUES (9999,'SIMON','MANAGER',7839,TO_DATE('2-4-1981','dd-mm-yyyy'),2975,NULL,20);

refresh에 대해 ON DEMAND로 설정했기에 방금 삽입한 데이터가 아직 emp_aggr_mv에 반영되지 않았다.

 

따라서, 수동으로 Refresh를 실행한다.

EXEC DBMS_MVIEW.refresh('emp_aggr_mv');

MV가 갱신됐으므로, 이제 MV를 통해서도 최신 부서별 급여 합계를 볼 수 있다.

 

Destroying and Altering Relations

DROP TABLE

DROP TABLE Students [RESTRICT | CASCADE];

drop table 명령을 통해 student 테이블을 데이터베이스에서 완전히 삭제한다.

table을 삭제할 경우 schema와 instance 모두 사라진다.

  • RESTRICT: table을 삭제할 때, 이 table을 참조하는 view나 foreign key가 존재하면 삭제를 거부한다. 즉 의존성이 있을 경우 DROP을 실패한다.
  • CASCADE:  table을 삭제학 때, 참조하는 view와 foreign key 등 종속된 객체도 모두 함께 삭제한다.

DROP TABLE vs DELETE vs TRUNCATE

  • DELETE FROM Students
    • table에 있는 데이터만 삭제하고, schema 구조는 유지한다.
    • WHERE 절 없이 DELETE를 하면 모든 행이 삭제되지만, 테이블 자체는 남아 있다.
  • TRUNCATE TABLE Students
    • table 데이터를 일괄 삭제하지만, schema 구조는 유지한다.
    • DELETE보다 훨씬 빠르고, rollback이 불가능한 경우가 많다.
  • DROP TABLE Students:
    • table 데이터와 schema 구조 모두 삭제한다.
    • 테이블 구조 또한 없어지므로 CREATE TABLE을 통해 재생성해야 한다.

ALTER TABLE

schema를 변경할 수 있다.

column을 추가/삭제할 수 있고 row의 이름 또는 자료형을 변경할 수 있다.

 

다음과 같이 ADD COLUMN을 통해 table에 column을 추가할 수 있다.

ALTER TABLE Students ADD COLUMN firstYear integer DEFAULT 2023;

Students 테이블에 firstYear이라는 새로운 정수형 column을 추가했다.

기존 table에 있는 모든 row의 값은 NULL로 채워진다. (DEFAULT를 설정했을 경우 DEFUALT값이 들어감)