2005/08/22 23:54
Prune의 사전적 의미

1.〔필요 없는 가지·뿌리 따위〕를 잘라내다,〔나무〕의 가지를 치다(i back, away, down, off i0); 전정(剪定)[전지]하다(i back i0).

2. (…에서)〔군더더기〕를 제거하다, (여분을) 제거하다(i away, down i0)[i of, from i0];〔비용〕을 절감하다;〔문장 따위〕를 간결하게 다듬다(i down i0).


Partition Pruning

Partition Pruning은 파티션 Table에 쿼리를 수행할 경우 Oracle Optimizer는 TABLE 정의에서 Partition에 대한 정보를 읽어와 WHERE 조건의 Partition Key를 보고 필요없는 Partition을 읽지 않고 필요한 파티션만을 읽는 기능을 말한다. 따라서 WHERE 조건에 만족하는 Partition만 Scan 하기 때문에 자원과 시간을 절약할 수 있다.

- Range or List partitioned tables의 경우는 WHERE 조건이 range , = , LIKE , IN 이어야 한다.
- Hash partitioned table의 경우는 WHERE 조건이 IN 이거나 = 경우만 partiton pruning이 실행된다.

- WHERE 조건의 partiton key 가 함수의 적용을 받을 때는 prunnig이 수행되지 않으나 단지 TO_DATE는 예외적으로 가능하다.


소개된 예를 살표보자.

사례 :한 회사에서 판매예상으로 잡았던 수량과 실제로 판매된 수량을 비교하고자 하는 작업을 수행하고자 한다. 테스트에 필요한 테이블은 아래 4가지

SALES_FORECAST: 판매예상
ACTUAL_SALES: 실제판매량
SALES_FORECAST_PR: PART_ID로 partitione된 판매예상 테이블
ACTUAL_SALES_PR: PART_ID로 partitione된 실제판매 테이블



SELECT COUNT(*)
FROM ACTUAL_SALES
WHERE PART_ID < 1600
AND QUANTITY < 500;

COUNT(*)
----------
29245

Elapsed: 00:07:04


----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 6 | 1015 |
| 1 | SORT AGGREGATE | | 1 | 6 | |
|* 2 | TABLE ACCESS FULL | ACTUAL_SALES | 29188 | 171K| 1015 |
----------------------------------------------------------------------



SELECT COUNT(*)
FROM ACTUAL_SALES_PR
WHERE PART_ID < 1600
AND QUANTITY < 500;

COUNT(*)
----------
29245

Elapsed: 00:00:02.04

----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 6 | 204 | | |
| 1 | SORT AGGREGATE | | 1 | 6 | | | |
| 2 | PARTITION RANGE ITERATOR| | | | | 1 | 2 |
|* 3 | TABLE ACCESS FULL | ACTUAL_SALES_PR | 29188 | 171K| 204 | 1 | 2 |
----------------------------------------------------------------------------------------------

Partition Iterator Information:
partition level = PARTITION
call time = RUN
order = ASCENDING
Partition iterator for level 1:
iterator = RANGE [0, 1]
index = 0
current partition: part# = 0, subp# = 65535, abs# = 0
current partition: part# = 1, subp# = 65535, abs# = 1



분석 : 너무도 뻔한 이야기지만 파티션 되지 않은 Table의 경우는 당연히 전체 Table을 Full Scan하여 결과를 유도했고 파티션된 Table의 경우는 해당하는 Partiton만 읽어왔기때문에 빠른 시간에 결과를 가져올 수 있었다.

출처 : http://www.dbazine.com/oracle/or-articles/mishra2

'IT > oracle' 카테고리의 다른 글

Pro*C  (0) 2008/02/27
bypass_ujvc(Updatable Join View Check)  (2) 2005/09/01
Partition-wise join  (0) 2005/08/23
Partition Pruning  (0) 2005/08/22
PL/SQL Example  (0) 2005/06/01
Posted by 형준군