Database/Theory

[Database/Theory] 14. view

양승길 2016. 6. 21. 19:29

[Database/Theory] 14. view

테이블과 동일하게 사용되는 개체다. 사용자 입장에서 테이블과 동일하다.

1
2
create view v_users
as select id, name from users;
cs


 - 보안성이 좋다.

뷰에 있는 내용만 보여지게 되고, 테이블에 있는 실제 데이터들이 노출되지 않는다.

그냥 테이블을 분리하면 된다 생각되지만 일관성이 떨어진다거나 관리가 어려워진다.


- 복잡한 쿼리의 단순화가 된다.

1
2
3
4
5
6
7
8
9
select   e1.last_name 사원이름, d1.department_name 부서이름, j1.급여 급여
from     employees e1, departments d1, (select   department_id 부서아이디, min(salary) 급여 
                                        from     employees 
                                        group by department_id) j1
where    d1.department_id = e1.department_id and 
         j1.부서아이디 = e1.department_id and 
         j1.급여 = e1.salary
order by d1.department_name, e1.last_name
 
cs

위와 같은 쿼리가 있다면 view로 만들어서 편리하게 사용하면 된다.

([Database/Practice]02. Oracle hr account table(2) 참조)


- create, alter, drop문으로 생성, 수정이 가능하다.

update, insert도 가능하다.

테이블과 마찬가지로 view를 insert나 update 할 경우 

NULL이 허용되지 않는것에 주의하도록한다.


그러나 집계함수[AVG(), MIN(), MAX(), COUNT(), COUNT_BIG(), STDEV()], UNION ALL,

Cross Join, group by를 사용한 View는 수정이 불가능하다.


 - View의 종류

표준뷰, 분할뷰, Indexed 뷰가 있다.


- 표준뷰

1개 이상의 테이블을 이용하여 만든 뷰다. 사용빈도가 가장 높다.


- 분할뷰(Partitioned View)

1대 이상의 서버에 있는 여러 테이블들을 join하여 1개의 테이블터럼 보이도록 된 뷰


- indexed view

복잡한 쿼리를 뷰로 만들어 사용하지만 실제로는 원래 테이블에 접근하는 것이기 때문에,

원래의 쿼리와 비유하면 속도는 높아지지 않는다.


이렇듯이 자주 사용되는 뷰에 실제 데이터를 대입하여 테이블까지 접근하지 않고 뷰까지만

접근하므로 쿼리의 성능이 높아진다.


즉 실제 데이터가 존재하고 고유의 clustered index에 의해 정렬되어 있는 뷰다.


계산하는데 사용되는 집계함수를 사용하거나 join하는 경우에 사용된다.


실제 테이블의 변경에 의하여 indexed view의 변경도 수행해야되는 번거로움과 시스템 부하라는

단점이 있기 때문에 변동이 드문 테이블에 사용되는 것이 좋다.


1
2
3
4
5
create view v_users with schemabinding
as select id, name, (math_score - science_score) from users;
 
create unique clustered index v_users_idx
in v_users(id);
cs

위와 같은 방법으로 생성이 된다.


만약에 뷰를 생성하는 구문에서 where절에 범위를 지정한다면 table scan을 할 것이다.


그리하여 계산식이 포함된 indexed view를 이용하여 범위를 이용한 쿼리가 효과적이다.

그러나 생성되는 index의 양은 증가하게 된다.

1
select id from v_users where (math_score - science_score) > 50;
cs