블록 그래뉼(Block Range Granules)의 개수와 크기는 동적으로 결정되지만 아래 파라미터로 그래뉼의 생성 방식을 조정할 수 있습니다. 파라미터에 따르면 블록 그래뉼의 기본 크기는 1GB이며, PX 서버 별로 최소 13개, 최대 100개의 그래뉼이 생성될 수 있습니다.
NAME DISPLAY_VALUE DEFAULT_VALUE DESCRIPTION
--------------------------- ------------- ------------- ------------------------------------------------------------
_px_granule_size 1000000 1000000 default size of a rowid range granule (in KB)
_px_min_granules_per_slave 13 13 minimum number of rowid range granules to generate per slave
_px_max_granules_per_slave 100 100 maximum number of rowid range granules to generate per slave
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 100, 'X') FROM XMLTABLE ('1 to 10000000');
아래 쿼리는 2 DOP로 t1 테이블을 조회합니다. PX 서버별로 13개의 그래뉼이 생성되어 실행 계획 6번의 Execs 값이 27(=(13*2)+1)로 표시됩니다.
-- 2
SELECT /*+ PARALLEL(2) */ COUNT (*) FROM t1;
===================================================================================================
| Id | Operation | Name | Time | Start | Execs | Rows | Read | Read |
| | | | Active(s) | Active | | (Actual) | Reqs | Bytes |
===================================================================================================
| 0 | SELECT STATEMENT | | 1 | +2 | 1 | 1 | | |
| 1 | SORT AGGREGATE | | 1 | +2 | 1 | 1 | | |
| 2 | PX COORDINATOR | | 1 | +2 | 3 | 2 | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | +2 | 2 | 2 | | |
| 4 | SORT AGGREGATE | | 1 | +2 | 2 | 2 | | |
| 5 | PX BLOCK ITERATOR | | 1 | +2 | 2 | 10M | | |
| 6 | TABLE ACCESS FULL | T1 | 2 | +1 | 27 | 10M | 1259 | 1GB |
===================================================================================================
_px_min_granules_per_slave 파라미터를 1로 설정하고 쿼리를 수행하면 실행 계획 6번의 Execs 값이 3(=(1*2)+1)으로 표시됩니다. 그래뉼 개수가 줄어들면 Read Reqs도 함께 줄어드는 것을 확인할 수 있습니다.
-- 3
ALTER SESSION SET "_px_min_granules_per_slave" = 1;
SELECT /*+ PARALLEL(2) */ COUNT (*) FROM t1;
===================================================================================================
| Id | Operation | Name | Time | Start | Execs | Rows | Read | Read |
| | | | Active(s) | Active | | (Actual) | Reqs | Bytes |
===================================================================================================
| 0 | SELECT STATEMENT | | 1 | +2 | 1 | 1 | | |
| 1 | SORT AGGREGATE | | 1 | +2 | 1 | 1 | | |
| 2 | PX COORDINATOR | | 1 | +2 | 3 | 2 | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | +2 | 2 | 2 | | |
| 4 | SORT AGGREGATE | | 1 | +2 | 2 | 2 | | |
| 5 | PX BLOCK ITERATOR | | 1 | +2 | 2 | 10M | | |
| 6 | TABLE ACCESS FULL | T1 | 2 | +1 | 3 | 10M | 1235 | 1GB |
===================================================================================================
_px_min_granules_per_slave 파라미터를 200으로 설정하고 쿼리를 수행하면 실행 계획 6번의 Execs 값이 407(=(200*2)+7)으로 표시됩니다. 생성되는 그래뉼의 개수에 따라 추가로 생성되는 그래뉼의 개수가 늘어나는 것으로 보입니다. 그래뉼 개수가 늘어나면 Read Reqs도 함께 늘어나므로 세그먼트 크기에 비해 그래뉼이 과도하게 생성되면 읽기 요청도 함께 늘어나 I/O 성능이 저하될 수 있습니다.
-- 4
ALTER SESSION SET "_px_min_granules_per_slave" = 200;
SELECT /*+ PARALLEL(2) */ COUNT (*) FROM t1;
===================================================================================================
| Id | Operation | Name | Time | Start | Execs | Rows | Read | Read |
| | | | Active(s) | Active | | (Actual) | Reqs | Bytes |
===================================================================================================
| 0 | SELECT STATEMENT | | 1 | +3 | 1 | 1 | | |
| 1 | SORT AGGREGATE | | 1 | +3 | 1 | 1 | | |
| 2 | PX COORDINATOR | | 1 | +3 | 3 | 2 | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | +3 | 2 | 2 | | |
| 4 | SORT AGGREGATE | | 2 | +2 | 2 | 2 | | |
| 5 | PX BLOCK ITERATOR | | 2 | +2 | 2 | 10M | | |
| 6 | TABLE ACCESS FULL | T1 | 3 | +1 | 407 | 10M | 1635 | 1GB |
===================================================================================================
_px_min_granules_per_slave 파라미터를 기본값인 13으로 설정하고, _px_granule_size 파라미터를 10000(10MB)로 설정하면 136개의 그래뉼이 생성됩니다.
-- 5
ALTER SESSION SET "_px_min_granules_per_slave" = 13;
ALTER SESSION SET "_px_granule_size" = 10000;
SELECT /*+ PARALLEL(2) */ COUNT (*) FROM t1;
===================================================================================================
| Id | Operation | Name | Time | Start | Execs | Rows | Read | Read |
| | | | Active(s) | Active | | (Actual) | Reqs | Bytes |
===================================================================================================
| 0 | SELECT STATEMENT | | 1 | +2 | 1 | 1 | | |
| 1 | SORT AGGREGATE | | 1 | +2 | 1 | 1 | | |
| 2 | PX COORDINATOR | | 1 | +2 | 3 | 2 | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | +2 | 2 | 2 | | |
| 4 | SORT AGGREGATE | | 1 | +2 | 2 | 2 | | |
| 5 | PX BLOCK ITERATOR | | 1 | +2 | 2 | 10M | | |
| 6 | TABLE ACCESS FULL | T1 | 2 | +1 | 136 | 10M | 1367 | 1GB |
===================================================================================================
_px_max_granules_per_slave 파라미터를 20으로 설정하면 41개(=(20*2)+1)의 그래뉼이 생성됩니다.
-- 6
ALTER SESSION SET "_px_max_granules_per_slave" = 20;
SELECT /*+ PARALLEL(2) */ COUNT (*) FROM t1;
===================================================================================================
| Id | Operation | Name | Time | Start | Execs | Rows | Read | Read |
| | | | Active(s) | Active | | (Actual) | Reqs | Bytes |
===================================================================================================
| 0 | SELECT STATEMENT | | 1 | +2 | 1 | 1 | | |
| 1 | SORT AGGREGATE | | 1 | +2 | 1 | 1 | | |
| 2 | PX COORDINATOR | | 1 | +2 | 3 | 2 | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | +2 | 2 | 2 | | |
| 4 | SORT AGGREGATE | | 1 | +2 | 2 | 2 | | |
| 5 | PX BLOCK ITERATOR | | 1 | +2 | 2 | 10M | | |
| 6 | TABLE ACCESS FULL | T1 | 2 | +1 | 41 | 10M | 1273 | 1GB |
===================================================================================================