프린트 하기

OS환경 : Oracle Linux 7.6 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c 파티션테이블 파티션별 count 확인

오라클 19c 파티션 테이블의 파티션별 row count 확인하는 방법을 설명함

 

 

테스트

통계정보 수집이 가능하거나, 통계정보가 최신인 경우
통계정보 수집이 불가능한 경우(파티션별 개별 count)

 

 

테스트
샘플 파티션 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SQL>
conn imsi/imsi
drop table ptable purge;
create table ptable
(
col1 varchar2(8),
col2 number
)
tablespace users
partition by range (col1)
(
partition p202101 values less than ('20210200'),
partition p202102 values less than ('20210300'),
partition p202103 values less than ('20210400'),
partition p202104 values less than ('20210500'),
partition p202105 values less than ('20210600'),
partition p202106 values less than ('20210700'),
partition p202107 values less than ('20210800'),
partition p202108 values less than ('20210900'),
partition p202109 values less than ('20211000'),
partition p202110 values less than ('20211100'),
partition p202111 values less than ('20211200'),
partition p202112 values less than ('20220100')
);
 
Table created.

 

 

파티션 테이블 샘플 데이터 삽입(원하는 만큼 실행)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL>
DECLARE
TYPE tbl_ins IS TABLE OF PTABLE%ROWTYPE INDEX BY BINARY_INTEGER;
w_ins tbl_ins;
BEGIN
for j in 1..10 loop
FOR i IN 1..100000 LOOP 
   w_ins(i).col1   := '2021'||to_char(round(dbms_random.value(1,12)) , 'FM09')||to_char( round(dbms_random.value(1,28)), 'FM09');
   w_ins(i).col2   := ceil(dbms_random.value(1, 10000000));
END LOOP;
FORALL i in 1..100000 INSERT INTO PTABLE VALUES w_ins(i);
   COMMIT;
end loop;
END;
/
 
PL/SQL procedure successfully completed

 

 

통계정보 수집이 가능하거나, 통계정보가 최신인 경우
통계정보 수집

1
2
3
SQL> exec dbms_stats.gather_table_stats(ownname => 'IMSI', tabname => 'PTABLE');
 
PL/SQL procedure successfully completed.

 

 

dba_tab_partitions 뷰 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL>
col table_name for a10
col partition_name for a20
select table_name, partition_name, num_rows from dba_tab_partitions
where table_name = 'PTABLE'
order by 1, 2;
 
TABLE_NAME PARTITION_NAME         NUM_ROWS
---------- -------------------- ----------
PTABLE     P202101                   45432
PTABLE     P202102                   90509
PTABLE     P202103                   90907
PTABLE     P202104                   90832
PTABLE     P202105                   91187
PTABLE     P202106                   91052
PTABLE     P202107                   90567
PTABLE     P202108                   91058
PTABLE     P202109                   91162
PTABLE     P202110                   91114
PTABLE     P202111                   90960
PTABLE     P202112                   45220
 
12 rows selected.

정상적으로 파티션별 row를 확인 가능함

 

 

통계정보 수집이 불가능한 경우(파티션별 개별 count)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SQL>
예시
set serveroutput on
DECLARE
  v_count NUMBER;
  v_exec_str VARCHAR2(1000);
BEGIN
  FOR r IN (SELECT partition_name FROM dba_tab_partitions where table_name = '테이블명' order by 1) LOOP
    v_exec_str := 'SELECT COUNT(*) FROM 테이블명 partition(' || r.partition_name || ')';
    EXECUTE IMMEDIATE v_exec_str INTO v_count;
    DBMS_OUTPUT.PUT_LINE(r.partition_name || ' : ' || v_count);
  END LOOP;
END;
/
 
실행
set serveroutput on
DECLARE
  v_count NUMBER;
  v_exec_str VARCHAR2(1000);
BEGIN
  FOR r IN (SELECT partition_name FROM dba_tab_partitions where table_name = 'PTABLE' order by 1) LOOP
    v_exec_str := 'SELECT COUNT(*) FROM PTABLE partition(' || r.partition_name || ')';
    EXECUTE IMMEDIATE v_exec_str INTO v_count;
    DBMS_OUTPUT.PUT_LINE(r.partition_name || ' : ' || v_count);
  END LOOP;
END;
/
 
P202101 : 45432
P202102 : 90509
P202103 : 90907
P202104 : 90832
P202105 : 91187
P202106 : 91052
P202107 : 90567
P202108 : 91058
P202109 : 91162
P202110 : 91114
P202111 : 90960
P202112 : 45220
 
PL/SQL procedure successfully completed.

정상적으로 파티션별 row를 확인 가능함

 

 

참고
특정 유저의 모든 파티션 테이블의 파티션별 row count

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SQL>
set serveroutput on
DECLARE
  v_count NUMBER;
  v_exec_str VARCHAR2(1000);
BEGIN
  FOR r IN (SELECT table_owner, table_name, partition_name FROM dba_tab_partitions where table_owner = 'SYS' order by 1, 2) LOOP
    v_exec_str := 'SELECT COUNT(*) FROM ' || r.table_name || ' partition(' || r.partition_name || ')';
    EXECUTE IMMEDIATE v_exec_str INTO v_count;
    DBMS_OUTPUT.PUT_LINE(r.table_owner||'.'||r.table_name||'.'||r.partition_name || ' : ' || v_count);
  END LOOP;
END;
/
 
.
.
SYS.WRP$_REPORTS_DETAILS.SYS_P2666 : 3
SYS.WRP$_REPORTS_DETAILS.SYS_P2642 : 13
SYS.WRP$_REPORTS_DETAILS.SYS_P2680 : 7
SYS.WRP$_REPORTS_TIME_BANDS.P0 : 0
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2645 : 13
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2696 : 2
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2714 : 2
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2705 : 2
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2678 : 2
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2669 : 3
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2625 : 4
SYS.WRP$_REPORTS_TIME_BANDS.SYS_P2683 : 7
SYS.WRR$_WORKLOAD_REPLAY_THREAD.WRR_REPLAY_THREAD_P1 : 0
 
PL/SQL procedure successfully completed.

정상적으로 유저가 가진 모든 테이블의 파티션별 row를 확인 가능함

 

 

참조 : 

https://positivemh.tistory.com/999
https://positivemh.tistory.com/1050