演習: SecureFile LOBの縮小

この演習では、SecureFile LOBを使用して領域を解放し、パフォーマンスを向上させる方法を示します。

  1. 新しい演習を開始する前に、演習の環境の推奨事項を参照してください。
  2. CLOB列のある表を作成します。
    1. SecureFile LOBの縮小を開始する前に、/home/oracle/labs/M104780GC10/setup_LOB.shシェル・スクリプトを実行し、LOBを拡張して縮小候補にするのに十分な領域を持つ表領域を作成します。
      $ cd /home/oracle/labs/M104780GC10
      $ /home/oracle/labs/M104780GC10/setup_LOB.sh
      
      SQL*Plus: Release 20.0.0.0.0 - Production on Fri Dec 13 11:05:28 2019
      Version 20.2.0.0.0
      
      Copyright (c) 1982, 2019, Oracle.  All rights reserved.
      
      Connected to:
      Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
      Version 20.2.0.0.0
      
      SQL> DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
      
      Tablespace dropped.
      
      SQL> CREATE TABLESPACE users DATAFILE '/home/oracle/labs/users01.dbf' SIZE 500M;
      
      Tablespace created.
      
      SQL> create user hr identified by password;
      
      User created.
      
      SQL> grant dba to hr;
      
      Grant succeeded.
      
      SQL> exit
      Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
      Version 20.2.0.0.0
      $
    2. PDB20にCLOB列のある表を作成します。
      $ sqlplus system@PDB20
      
      SQL*Plus: Release 20.0.0.0.0 - Production on Fri Dec 13 11:09:44 2019
      Version 20.2.0.0.0
      
      Copyright (c) 1982, 2019, Oracle.  All rights reserved.
      
      Enter password: password
      Last Successful login time: Fri Dec 13 2019 10:42:50 +00:00
      
      Connected to:
      Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
      Version 20.2.0.0.0
      
      SQL> CREATE TABLE hr.t1 ( a CLOB) LOB(a) STORE AS SECUREFILE TABLESPACE users;
      
      Table created.
      
      SQL>
    3. 行を挿入し、CLOBデータを更新してコミットします。
      SQL> INSERT INTO hr.t1 values ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
      
      1 row created.
      
      SQL> INSERT INTO hr.t1 Select * from hr.t1;
      
      1 row created.
      
      SQL> INSERT INTO hr.t1 Select * from hr.t1;
      
      2 rows created.
      
      SQL> INSERT INTO hr.t1 Select * from hr.t1;
      
      4 rows created.
      
      SQL> UPDATE hr.t1 SET a=a||a||a||a||a||a||a;
      
      8 rows updated.
      
      SQL> UPDATE hr.t1 SET a=a||a||a||a||a||a||a;
      
      8 rows updated.
      
      SQL> COMMIT;
      
      Commit complete.
      
      SQL>
  3. LOBセグメントを縮小します。
    SQL> ALTER TABLE hr.t1 MODIFY LOB(a) (SHRINK SPACE);
    
    Table altered.
    
    SQL>
  4. 解放されたエクステントまたはブロックの数を表示します。
    SQL> SET PAGES 100
    SQL> SELECT * FROM v$securefile_shrink;
    
      LOB_OBJD SHRINK_STATUS
    ---------- ----------------------------------------
    START_TIME
    ---------------------------------------------------------------------------
    END_TIME
    ---------------------------------------------------------------------------
    BLOCKS_MOVED BLOCKS_FREED BLOCKS_ALLOCATED EXTENTS_ALLOCATED EXTENTS_FREED
    ------------ ------------ ---------------- ----------------- -------------
    EXTENTS_SEALED     CON_ID
    -------------- ----------
         74403 COMPLETE
    13-DEC-19 11.14.30.702 AM +00:00
    13-DEC-19 11.14.33.520 AM +00:00
               2            2                2                 1             1
                 1          4
    
    
    SQL>

    その結果、2つのブロックが解放されています。

  5. CLOBを更新します。
    SQL> UPDATE hr.t1 SET a=a||a||a||a||a||a||a;
    
    8 rows updated.
    
    SQL> UPDATE hr.t1 SET a=a||a||a||a||a||a||a;
    
    8 rows updated.
    
    SQL> UPDATE hr.t1 SET a=a||a||a||a||a||a||a;
    
    8 rows updated.
    
    SQL> UPDATE hr.t1 SET a=a||a||a||a||a||a||a;
    
    8 rows updated.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL>
  6. LOBセグメントを縮小します。
    SQL> ALTER TABLE hr.t1 MODIFY LOB(a) (SHRINK SPACE);
    
    Table altered.
    
    SQL>
  7. 解放されたエクステントまたはブロックの数を表示します。
    SQL> SELECT * FROM v$securefile_shrink;
    
      LOB_OBJD SHRINK_STATUS
    ---------- ----------------------------------------
    START_TIME
    ---------------------------------------------------------------------------
    END_TIME
    ---------------------------------------------------------------------------
    BLOCKS_MOVED BLOCKS_FREED BLOCKS_ALLOCATED EXTENTS_ALLOCATED EXTENTS_FREED
    ------------ ------------ ---------------- ----------------- -------------
    EXTENTS_SEALED     CON_ID
    -------------- ----------
         74403 COMPLETE
    13-DEC-19 11.22.07.225 AM +00:00
    13-DEC-19 11.22.18.281 AM +00:00
            2648         2648             2648                 0            11
                11          4
    
         74403 COMPLETE
    13-DEC-19 11.14.30.702 AM +00:00
    13-DEC-19 11.14.33.520 AM +00:00
               2            2                2                 1             1
                 1          4
    
    SQL>

    その結果、2648個のブロックが解放されています。最初の行が変化していないことに注目します。

  8. CLOBを更新します。
    SQL> UPDATE hr.t1 SET a=a||a;
    
    8 rows updated.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL>
  9. LOBセグメントを縮小します。
    SQL> ALTER TABLE hr.t1 MODIFY LOB(a) (SHRINK SPACE);
    
    Table altered.
    
    SQL>
  10. 解放されたエクステントまたはブロックの数を表示します。
    SQL> SELECT * FROM v$securefile_shrink WHERE LOB_OBJD=74403;
    
      LOB_OBJD SHRINK_STATUS
    ---------- ----------------------------------------
    START_TIME
    ---------------------------------------------------------------------------
    END_TIME
    ---------------------------------------------------------------------------
    BLOCKS_MOVED BLOCKS_FREED BLOCKS_ALLOCATED EXTENTS_ALLOCATED EXTENTS_FREED
    ------------ ------------ ---------------- ----------------- -------------
    EXTENTS_SEALED     CON_ID
    -------------- ----------
         74403 COMPLETE
    13-DEC-19 11.22.07.225 AM +00:00
    13-DEC-19 11.22.18.281 AM +00:00
            2648         2648             2648                 0            11
                11          4
    
         74403 COMPLETE
    13-DEC-19 11.24.14.623 AM +00:00
    13-DEC-19 11.24.39.373 AM +00:00
            5484         5484             5484                 1            19
                19          4
    
    SQL> EXIT
    $

    その結果、5484個のブロックが解放されています。前の縮小操作の行のみが保持されていることに注目します。