이번포스팅에서는 오라클 View의 중요한 사용법 중 하나인 조건침투방법에 대해 정리해 보려 합니다.
View 조건침투
오라클에서 뷰(View)는 하나 이상의 테이블이나 다른 뷰를 기반으로 생성된 가상테이블입니다.
뷰를 사용할 때는 조건침투(condition Pushdown)라는 개념을 이해하는 것이 중요합니다.
저는 여태까지 View를 사용하면서 View안에 조건들을 미리 다 정의해 놓고
해당 View를 사용하면 항상 같은 결과가 나오도록 사용했습니다.
(창피하네요 ㅇㅅㅇ!)
조건침투
쿼리에서 뷰를 사용할 때 뷰 안에 정의된 조건절이 아닌
외부쿼리에서 뷰 내부로 조건을 침투시킬 수 있습니다.
말이 어렵지만 예제를 보면 쉽게 이해가 되실겁니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--VIEW===========================
CREATE VIEW ActiveEmployees
AS
SELECT *
FROM Employees
WHERE IsActive = 'Y'
AND NAME = 'Mike' ;
--Query==========================
SELECT *
FROM ActiveEmployees ;
|
cs |
위의 예제는 우리가 얻고자 하는 조건을 View안에 모두 정의하고 View를 호출해서 사용하고 있습니다.
(처음에 말했던 제가 원래 View를 사용하던 방법이죠,,,)
View Condition Pushdown 기능을 사용하면 아래와 같이 변경할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
--VIEW===========================
CREATE VIEW ActiveEmployees
AS
SELECT EMP_NO
,NAME
,AGE
FROM Employees
WHERE IsActive = 'Y' ;
--Query==========================
SELECT *
FROM ActiveEmployees
WHERE NAME = 'Mike' ;
|
cs |
첫 번째 방식은 조건값이 고정되어 있으나 두 번째는 상황에 맞게 조건값을 수정해서 조회할 수 있습니다.
처음에 조건침투에 대해 몰랐을 때는 두 번째 예제쿼리를 보고 이상하다고 생각했습니다.
View를 하나의 가상테이블이라고 생각했을 때 가상테이블을 만드는 Range조건이 없다!?!?!
이제라도 알게 되어서 다행이라고 생각합니다.(공부만이 살길이다)
옵티마이저는 View안에 정의된 쿼리와 외부쿼리에서 침투하는 조건을 이용해 실행계획을 다시 세웁니다.
즉, View안에 Range조건이 없어도 외부에서 조건침투하면 View의 성능에 문제가 없습니다.
View 조건침투 사용시 주의사항
아래의 Case는 View안으로 조건을 침투시킬 수 없습니다.
- View에 침투시키려고 하는 조건의 컬럼이 View안에서 가공(DECODE, NVL, SUBSTR 등등)
되어있는 경우 - View에 침투시키려고 하는 조건이 View안에서 Scalar Subquery로 가공되어 있을 경우
- View에 침투시키려고 하는 조건이 View안에서 User Defined Function으로 가공되어 있는 경우
위의 세가지 Case에 유의해서 사용하셔야 합니다.
읽어주셔서 감사합니다!
