본문 바로가기

DataBase/Oracle

[펌]with문을 활용하자


oracle 9i 이상에서 지원됩니다.

제가 써본 경험으로는 속도뿐만이 아니라 sql 자체도 많이 간결해졌습니다.

특히 union에 똑같은 문장이 계속 들어갈 경우 사용하면 한번만 기술하고 불러쓰면 됩니다.

문장이 많이 간결해지겠죠?

 

//기본With문에서  , alias as 로 연결하여 쓰면 된다.

with A as (
      ....
      ) ,
      B as (
      ....
      )

select ..
         ..
   from (
           select * from A
         ),
         (
           select * from B
         )
-----

in-line view or temporary table에서 “with”구 사용

복잡한 SQL에서 동일 블록에 대해 반복적으로 사용하는 경우 그 블록을 재사용 할 수 있게 함으로서 성능향상을 높일 수 있는데 with절을 이용하여 미리 Query Block을 만들 수 있습니다. with에 의해 만들어 지는 것은 메모리에 존재하는 가상 테이블 정도로 보시면 될 겁니다.

아래의 예를 통해 이해 하도록 합니다.

SQL> -- 아래는 전체 사원 급여의 30% 이상을 차지하는 부서와
SQL> -- 그 부서의 급여의 합을 출력 합니다.
SQL> select
  2      dname,
  3      sum(sal)
  4  from emp natural join dept
  5  group by dname
  6  having sum(sal) > (select sum(sal) * 0.3 from emp)
  7  ;

DNAME            SUM(SAL)
-------------- ----------
ACCOUNTING           8750
RESEARCH            10875
SALES                9400

SQL> -- 아래는 같은 결과를 나타내는 동일한 SQL 문장 입니다.
SQL>
SQL> with total_sal as (
  2      select dname dname,
  3             sum(sal) mysal
  4      from emp natural join dept
  5      group by dname
  6  )
  7  select dname, mysal
  8  from total_sal
  9  where mysal > (select sum(sal) * 0.3 from emp);

DNAME               MYSAL
-------------- ----------
ACCOUNTING           8750
RESEARCH            10875
SALES                9400


---

union을 이용하여 데이터를 가지고 오는 경우 Query가 조건절등에서
반복되는 경우가 있습니다.
이를 with로 빼냈을때와 안빼냈을때는 속도의 많은 차이가 있습니다.

 

'DataBase > Oracle' 카테고리의 다른 글

작업 진행율  (0) 2008.08.08
[펌]XMLTYPE 기본 사용 예  (0) 2008.08.08
SQL*LOADER에서 SEQUENCE함수와 DECODE함수 사용하는 방법  (0) 2008.08.08
SQL*Loader에 사용되는 파일들  (0) 2008.08.08
SQL*Loader란?  (0) 2008.08.08