PostgreSQL과 ORACLE의 Lateral Inline View에 대한 짤막한 내용

PostgreSQL 연구와 집필 때문에 중단한 기술 포스팅을 오랜만에 다시 시작합니다.
이번 시간에 살펴볼 내용은 Lateral Inline View입니다.

Lateral Inline View란?


Lateral Inline View를 그대로 해석하면 “측면 인라인 뷰”이며, 이는 Lateral Inline View의 동작 원리를 매우 적절히 표현한 것으로 보입니다.

Lateral Inline View에 대해서 알게 된 것은 매우 오래전에 오동규 님의 블로그를 통해서입니다.

그동안 이런 것이 있다는 정도만을 기억한 채로 PostgreSQL을 연구하던 중에 PostgreSQL은 9.3 버전부터 Lateral Inline View를 지원한다는 것을 알게 됐습니다.

그래서 Oracle의 지원 여부를 확인해보니 12c부터 지원이 된다는 사실을 알았습니다. (아래 링크 참조. Oracle 공부를 게을리한 탓에 너무 늦게 안 셈이죠. ㅠㅠ)

https://oracle-base.com/articles/12c/lateral-inline-views-cross-apply-and-outer-apply-joins-12cr1

Lateral Inline View의 활용


Lateral Inline View는 크게 2가지 용도로 활용할 수 있을 것 같습니다.

  1.  JPPD (Join Predicate Push-Down)을 사용자가 직접 구현
  2. 테이블과 Function 조인

1. JPPD (Join Predicate Push-Down)을 사용자가 직접 구현

JPPD를 직접 구현하는 것은 PostgreSQL에서는 반드시 필요한 부분입니다. 왜냐면 PostgreSQL은 아직 View Merging이나 JPPD가 매우 제약적인 상황에서만 가능하기 때문입니다. 따라서 튜닝을 위해서는 Lateral View를 직접 사용해야하는 경우가 많습니다.

그런데 ORACLE은 버전이 올라갈수록 이전 버전에서 존재하던 Complex View Merging과 JPPD의 제약 사항을 점차 해결하고 있습니다. 12c 버전에서는 JPPD가 안되는 경우를 거의 찾아보기 힘들 정도입니다. 그나마 안되는 경우는 MINUS의 경우입니다. 이 같은 경우에는 Lateral View를 사용해서 JPPD를 구현함으로써 튜닝이 가능합니다. (아래 링크 참조)

https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:9530805900346903033

2. 테이블과 Function 조인

Lateral Inline View를 이용하면 테이블 추출 값을 Function의 아규먼트로 입력하는 작업을 매우 편리하게 할 수 있습니다.

아래는 T1 테이블의 모든 블록(0~28571)의 Frozen 상태를 확인하기 위해서 get_raw_page function에 0~28571을 입력한 후에 t_infomask 칼럼의 FROZEN 비트를 확인하는 예제입니다.

select substr(cast(b.t_infomask::bit(16) as text),7,1) frozen_flag, 
       count(*)
from  (select i from generate_series(0,28571) a(i)) a, 
       LATERAL (select * from heap_page_items(get_raw_page('t1', a.i))) b
group by substr(cast(b.t_infomask::bit(16) as text),7,1);

아래는 ORACLE에서 사용자 Function을 생성한 후에 테이블 추출 값을 이용해서 Function 결과를 출력하는 예제

create or replace function func1(p1 IN NUMBER)
return NUMBER
is
  v_ret number;
begin
  v_ret := p1+1;
  return v_ret;
end;
/

select a.*, b.*
from   (select level lv from dual connect by level<=10) a,
       LATERAL (select func1(a.lv) from dual) b;    
        LV FUNC1(A.LV)
---------- -----------
         1           2
         2           3
         3           4
         4           5
         5           6
         6           7
         7           8
         8           9
         9          10
        10          11

이상으로 Laeral Inline View에 대한 간단한 설명을 마무리하겠습니다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s