-- 서브파티션 레벨에서만 통계를 수집하도록 한다(파생통계)
SQL> BEGIN
2 DBMS_STATS.DELETE_TABLE_STATS(ownname => user,
3 tabname => 't');
4 DBMS_STATS.GATHER_TABLE_STATS(ownname => user,
5 tabname => 't',
6 estimate_percent => 100,
7 granularity => 'subpartition');
8 END;
9 /
SQL> SELECT count(DISTINCT sp)
2 FROM t;
COUNT(DISTINCTSP)
-----------------
100
-- 글로벌레벨의 통계가 부정확한 것을 확인 할 수 있다.
SQL> SELECT num_distinct, global_stats
2 FROM USER_TAB_COL_STATISTICS
3 WHERE table_name = 'T'
4 AND column_name = 'SP';
NUM_DISTINCT GLOBAL_STATS
------------ ------------
28 NO
-- 파티션 레벨의 통계도 부정확한 것을 확인할 수 있다.
SQL> SELECT num_distinct, global_stats
2 FROM USER_PART_COL_STATISTICS
3 WHERE table_name = 'T'
4 AND partition_name = 'Q1'
5 AND column_name = 'SP';
NUM_DISTINCT GLOBAL_STATS
------------ ------------
28 NO
SQL> SELECT 'Q1_SP1' AS subpartition_name, count(DISTINCT sp) FROM t SUBPARTITION (q1_sp1)
2 UNION ALL
3 SELECT 'Q1_SP2', count(DISTINCT sp) FROM t SUBPARTITION (q1_sp2)
4 UNION ALL
5 SELECT 'Q1_SP3', count(DISTINCT sp) FROM t SUBPARTITION (q1_sp3)
6 UNION ALL
7 SELECT 'Q1_SP4', count(DISTINCT sp) FROM t SUBPARTITION (q1_sp4);
SUBPARTITION_NAME COUNT(DISTINCTSP)
----------------- -----------------
Q1_SP1 20
Q1_SP2 28
Q1_SP3 25
Q1_SP4 27
-- 파리션 레벨의 통계는 정확한 것을 확인할 수 있다.
SQL> SELECT subpartition_name, num_distinct, global_stats
2 FROM USER_SUBPART_COL_STATISTICS
3 WHERE table_name = 'T'
4 AND column_name = 'SP'
5 AND subpartition_name LIKE 'Q1%'
6 ORDER BY subpartition_name;
SUBPARTITION_NAME NUM_DISTINCT GLOBAL_STATS
----------------- ------------ ------------
Q1_SP1 20 YES
Q1_SP2 28 YES
Q1_SP3 25 YES
Q1_SP4 27 YES
DBMS_STATS.COPY_TABLES_STATS(ownname => user,
tabname => 't',
srcpartname => 'p_2014_q1',
dstpartname => 'p_2015_q1',
scale_factor => 1);
- 강좌 URL : http://www.gurubee.net/lecture/4382
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.