[SQL] 데이터베이스 객체(3) VIEW

오잉·2023년 7월 3일
0

SQL

목록 보기
3/3

1. VIEW란?

데이터베이스 객체란 TABLE이나 INDEX등 데이터베이스 안에 정의하는 모든 것을 말한다.
VIEW 역시 데이터베이스 객체 중 하나이다.

반면 SELECT 명령은 데이터베이스 객체가 아니다. (명령에 이름을 지정할 수도 없고, 데이터베이스에 등록되지도 않기 때문)

이렇게 데이터베이스 객체로 등록할 수 없는 SELECT 명령을, 객체로서 이름을 붙여 관리할 수 있도록 한 것이 VIEW
SELECT 명령은 실행했을 때 테이블에 저장된 데이터를 결괏값으로 반환
-> VIEW를 참조하면 그에 정의된 SELECT 명령의 실행결과를 테이블처럼 사용할 수 있다.
=> 즉, VIEW는 SELECT 명령을 기록하는 데이터베이스 객체이다

2. VIEW의 장점

다음의 예시처럼 FROM구에는 서브쿼리를 사용할 수 있다.

SELECT * FROM (SELECT * FROM test_table) sq;

앞의 예에서 서브쿼리 부분을 VIEW로 만들면 다음과 같은 SELECT 명령이 가능하다.

SELECT * FROM view_name;

=> VIEW : FROM 구에 기술된 서브쿼리에 이름을 붙이고 데이터베이스 객체화하여 쓰기 쉽게 한 것
(서브쿼리 : SELECT 명령에 의한 데이터 질의. 상부가 아닌 하부의 부수적인 질의)

  • 장점 1. 복잡한 서브쿼리를 VIEW로 대체하여 SELECT 명령을 간략하게 표현할 수 있다
    (앞 예시에서는 서브쿼리가 단순한 SELECT 명령으로 되어 있지만, 실무에서는 WHERE구로 조건을 지정하거나 GROUP BY 구로 집계하는 등 좀 더 복잡한 명령으로 이루어지는 경우가 많다)
  • 장점 2. 자주 사용하는 SELECT 명령을 데이터베이스에 등록해 두었다가 간단히 실행할 수 있다.

3. 가상 테이블

VIEW는 TABLE처럼 취급할 수 있지만 '실체가 존재하지 않는다'라는 의미로 가상 테이블이라 불리기도 한다.
VIEW는 TABLE처럼 데이터를 쓰거나 지울 수 있는 저장공간을 가지지 않는다.
-> SELECT 명령에서만 사용하는 것을 권장 (INSERT, UPDATE, DELETE에서도 조건이 맞으면 가능하지만 주의해야함)

4. VIEW 생성

CREATE VIEW 뷰명 AS + SELECT 명령

CREATE VIEW view_name AS
	SELECT * FROM table_name; // VIEW 생성
    
SELECT * FROM view_name; // VIEW 사용

CREATE VIEW 뷰명(열명1,열명2,...) AS + SELECT 명령

CREATE VIEW view_name(n, v, v2) AS 
	SELECT no, a, a*2 FROM table_name; // VIEW 생성
    
SELECT * FROM view_name WHERE n=1; // VIEW 사용
  • VIEW의 열 지정 생략시 : SELECT 구에서 지정하는 열 정보가 수집되어 자동적으로 VIEW의 열로 지정
  • VIEW의 열 지정시 : SELECT 구에 지정한 열보다 우선시
    • SELECT 구와 같은 수의 열을 일일이 지정해야함 -> SELECT 명령의 모든 열을 사용할 경우 열 지정 안하는게 나음
  • 열 이외에는 정의 불가. 테이블의 열을 정의할 때처럼 자료형이나 제약도 지정 불가.

5. VIEW 삭제

DROP VIEW view_name;

6. VIEW의 약점

  • VIEW는 데이터베이스 객체로서 저장장치에 저장된다.
  • 데이터베이스에 저장되는 것은 SELECT 명령 뿐 -> TABLE과 달리 대량의 저장공간을 필요로 하지 않는다
  • SELECT 명령은 검색뿐 아니라 ORDER BY로 정렬하거나 GROUP BY로 집계할 수 있다 -> 계산능력을 필요로 하기 때문에 CPU자원을 사용

VIEW를 참조하면 뷰에 등록되어 있는 SELECT명령이 실행됨 -> 실행결과는 일시적으로 보존
VIEW를 참조할 때마다 SELECT 명령이 실행됨

Materialized View

  • 약점 : VIEW의 근원이 되는 TABLE에 보관하는 데이터양이 많은 경우, 집계처리를 할 때도 VIEW가 사용된다면 처리속도가 많이 떨어진다. 또한 VIEW를 중첩해서 사용하는 경우에도 처리 속도가 떨어진다.
  • 해결 : Materizalized View
    • 일반적 VIEW : 데이터를 일시적으로 저장했다가 쿼리가 실행 종료될 때 함께 삭제
    • Materizalized View : 데이터를 일시적으로 저장해 사용하는 것이 아니라 TABLE처럼 저장장치에 저장해두고 사용

Materizalized View는 처음 참조되었을 때 데이터를 저장해둔다.
이후 다시 참조할 때 이전에 저장해 두었던 데이터를 그대로 사용한다.
-> 일반적인 VIEW처럼 매번 SELECT명령을 실행할 필요가 없다.
(다만, VIEW에 지정된 TABLE의 데이터가 변경된 경우에는 RDBMS가 자동으로 SELECT명령을 재실행하여 데이터를 다시 저장)
=> VIEW에 지정된 TABLE의 데이터가 자주 변경되지 않는 경우라면 Materialized View를 사용하여 VIEW의 약점을 어느정도 보완 가능! 근데.. MySQL에서는 사용할 수 없다.

함수 테이블

  • 약점 : VIEW를 구성하는 SELECT명령은 단독으로도 실행할 수 있어야 한다.
    상관 서브쿼리(부모 쿼리와 어떤 식으로든 연관된 서브쿼리)의 경우에는 뷰의 SELECT명령으로 사용할 수 없다.
  • 해결 : 함수 테이블
    • 함수 테이블은 TABLE을 결괏값으로 반환해주는 사용자정의 함수이다.
      함수에는 인수를 지정할 수 있기 때문에 인수의 값에 따라 WHERE조건을 붙여 결괏값을 바꿀 수 있다. 그에 따라 상관 서브쿼리처럼 동작할 수 있다.
profile
오잉이라네 오잉이라네 오잉이라네 ~

0개의 댓글