GAGA LIFE.

インフラエンジニアブログ

スポンサーリンク

【Oracle】特定のパーティションのロック

目的

テーブルの統計情報をLOCK_TABLE_STATSを使用してロックすることはよくあるが、 特定のパーティションの統計情報をロックする方法のメモ。

マニュアル

Oracle Database PL/SQLパッケージおよびタイプ・リファレンス 19c
171.7.79 LOCK_PARTITION_STATSプロシージャ
このプロシージャによって、ユーザーはパーティションの統計情報をロックできます。
構文
DBMS_STATS.LOCK_PARTITION_STATS (
    ownname    VARCHAR2,
    tabname    VARCHAR2,
    partname   VARCHAR2);

パラメータ
表171-83 LOCK_PARTITION_STATSプロシージャのパラメータ
パラメータ  説明
ownname     ロックするスキーマの名前。
tabname     表の名前
partname    (サブ・)パーティション名。

事前準備

パーティション表の準備

SQL> DROP TABLE T1 PURGE;

Table dropped.

SQL> CREATE TABLE T1 (C1 NUMBER, C2 DATE, C3 VARCHAR2(100) , CONSTRAINT PK_T4 PRIMARY KEY (C1))
PARTITION BY RANGE(C2) SUBPARTITION BY HASH (C1) SUBPARTITIONS 4 (
    PARTITION PRT_202104 VALUES LESS THAN(TO_DATE('202105','YYYYMM')),
    PARTITION PRT_202105 VALUES LESS THAN(TO_DATE('202106','YYYYMM')),
    PARTITION PRT_202106 VALUES LESS THAN(TO_DATE('202107','YYYYMM')),
    PARTITION PRT_202107 VALUES LESS THAN(TO_DATE('202108','YYYYMM'))
);  2    3    4    5    6    7  

Table created.

SQL> CREATE INDEX T1IDX ON T1 (C2) LOCAL
(PARTITION I1
   (SUBPARTITION I1_H1,
    SUBPARTITION I1_H2,
    SUBPARTITION I1_H3,
    SUBPARTITION I1_H4),
 PARTITION I2
   (SUBPARTITION I2_H1,
    SUBPARTITION I2_H2,
    SUBPARTITION I2_H3,
    SUBPARTITION I2_H4),
 PARTITION I3
   (SUBPARTITION I3_H1,
    SUBPARTITION I3_H2,
    SUBPARTITION I3_H3,
    SUBPARTITION I3_H4),
 PARTITION I4
   (SUBPARTITION I4_H1,
    SUBPARTITION I4_H2,
    SUBPARTITION I4_H3,
    SUBPARTITION I4_H4));  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21  

Index created.

SQL> CREATE INDEX T1GIDX ON t1 (C3);

Index created.

SQL> drop sequence s1;

Sequence dropped.

SQL> create sequence s1;

Sequence created.

SQL> declare
  varDate date;
  varSeq NUMBER;
begin
  varDate := to_date('2021-04-01', 'YYYY-MM-DD');
  for j in 1..4 loop
    for i in 1..10000 loop
      select s1.nextval into varSeq from dual;
      insert into T1 values(varSeq, varDate, lpad(to_char(varSeq), 100, '0'));
    end loop;
    commit;
    varDate := add_months(varDate, 1);
  end loop;
end;
/  2    3    4    5    6    7    8    9   10   11   12   13   14   15  

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SCOTT',TABNAME=>'T1',DEGREE => 10,NO_INVALIDATE=>FALSE);

PL/SQL procedure successfully completed.

実行例

特定のパーティションの統計をロック

SQL> SELECT OWNER,OBJECT_TYPE,TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME,NUM_ROWS,TO_CHAR(LAST_ANALYZED,'YYYY/MM/DD HH24:MI:SS') LAST_ANALYZED,STATTYPE_LOCKED,STALE_STATS
FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = 'T1' ORDER BY PARTITION_NAME,SUBPARTITION_NAME;  2  

OWNER                OBJECT_TYPE  TABLE_NAME           PARTITION_NAME       SUBPARTITION_NAME      NUM_ROWS LAST_ANALYZED       STATTYPE_LOCKED      STALE_STATS
-------------------- ------------ -------------------- -------------------- -------------------- ---------- ------------------- -------------------- --------------------
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3579
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3580
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3581
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3582
SCOTT                PARTITION    T1                   PRT_202104                                     10000 2022/07/15 20:21:19                      NO
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3583
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3584
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3585
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3586
SCOTT                PARTITION    T1                   PRT_202105                                     10000 2022/07/15 20:21:19                      NO
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3587
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3588
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3589
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3590
SCOTT                PARTITION    T1                   PRT_202106                                     10000 2022/07/15 20:21:19                      NO
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3591
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3592
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3593
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3594
SCOTT                PARTITION    T1                   PRT_202107                                     10000 2022/07/15 20:21:19                      NO
SCOTT                TABLE        T1                                                                  40000 2022/07/15 20:21:19                      NO

21 rows selected.

SQL> exec dbms_stats.lock_partition_stats(ownname=> 'SCOTT', tabname=> 'T1', partname=> 'PRT_202104');

PL/SQL procedure successfully completed.

SQL> SELECT OWNER,OBJECT_TYPE,TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME,NUM_ROWS,TO_CHAR(LAST_ANALYZED,'YYYY/MM/DD HH24:MI:SS') LAST_ANALYZED,STATTYPE_LOCKED,STALE_STATS
FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = 'T1' ORDER BY PARTITION_NAME,SUBPARTITION_NAME;  2  

OWNER                OBJECT_TYPE  TABLE_NAME           PARTITION_NAME       SUBPARTITION_NAME      NUM_ROWS LAST_ANALYZED       STATTYPE_LOCKED      STALE_STATS
-------------------- ------------ -------------------- -------------------- -------------------- ---------- ------------------- -------------------- --------------------
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3579                                        ALL ★
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3580                                        ALL ★
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3581                                        ALL ★
SCOTT                SUBPARTITION T1                   PRT_202104           SYS_SUBP3582                                        ALL ★
SCOTT                PARTITION    T1                   PRT_202104                                     10000 2022/07/15 20:21:19 ALL ★               NO
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3583
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3584
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3585
SCOTT                SUBPARTITION T1                   PRT_202105           SYS_SUBP3586
SCOTT                PARTITION    T1                   PRT_202105                                     10000 2022/07/15 20:21:19                      NO
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3587
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3588
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3589
SCOTT                SUBPARTITION T1                   PRT_202106           SYS_SUBP3590
SCOTT                PARTITION    T1                   PRT_202106                                     10000 2022/07/15 20:21:19                      NO
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3591
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3592
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3593
SCOTT                SUBPARTITION T1                   PRT_202107           SYS_SUBP3594
SCOTT                PARTITION    T1                   PRT_202107                                     10000 2022/07/15 20:21:19                      NO
SCOTT                TABLE        T1                                                                  40000 2022/07/15 20:21:19                      NO

21 rows selected.

指定したパーティションと紐づくサブパーティションがロックされている

スポンサーリンク