9 IM列ストアに対するIMファスト・スタートの管理

IM列ストアが有効になっている場合は、インメモリー・ファスト・スタート(IMファスト・スタート)により、列データをディスクに格納することでデータベースをより迅速に開くことができます。

この章のトピックは、次のとおりです:

9.1 IMファスト・スタートについて

IMファスト・スタートでは、IMCUをディスクに直接格納することで、IM列ストアへのデータベース・オブジェクトの移入が最適化されます。

データベースは、インスタンスの障害およびリカバリの後、または異なるOracle RACインスタンスへの複製中に、IM FastStart領域から読み取ることができます。

注意:

IMファスト・スタートは、読取り専用であるスタンバイ・データベースではサポートされていません。

この項では、次の項目について説明します。

9.1.1 IMファスト・スタートの目的

IM列ストアは、データベース・インスタンスを再起動すると必ず移入されます。これは、I/OおよびCPUに負担がかかる低速な操作となる可能性があります。

IMファスト・スタートが有効になっている場合、データベースでは、インスタンス再起動中の再移入を高速化するために、定期的に列データのコピーがディスクに保存されます。データベースを閉じてから再度開くと、データベースによって、FastStart領域から列データが読み取られ、それがIM列ストアに移入され、すべてのトランザクション一貫性が確保されます。

IMファスト・スタート表領域では、データベースが開かれて使用可能になっている間、断続的なI/Oが必要となります。データベースでCPUに負荷のかかるデータ圧縮およびフォーマットが行われなくなるため、データベースを再度開いたときにパフォーマンスが向上します。

9.1.2 IMファスト・スタートはどのように機能するか

FastStart領域は、IMファスト・スタートによりINMEMORYオブジェクトのデータが格納および管理される、指定された表領域です。Oracle Databaseでは、FastStart表領域はDBAの介入なしで管理されます。

1つのFastStart領域、および指定された1つのFastStart表領域のみが、各PDBまたは非CDBに対して許可されます。表領域は、指定されたIM FastStart表領域である間は、変更も削除もできません。Oracle RACデータベースでは、すべてのノードでFastStartデータが共有されます。

DBMS_INMEMORY_ADMIN.FASTSTART_ENABLEプロシージャを使用してFastStart表領域を有効にします。領域管理ワーカー・プロセス(Wnnn)で、SYSDBinstance_name_LOBSEG$という名前で空のSecureFiles LOBが作成されます。

注意:

FastStart領域を作成するには、IM FastStart領域の有効化では不十分です。データの移入または再移入が必要となります。

この項では、次の項目について説明します。

9.1.2.1 データベースではどのようにFastStart領域が管理されるか

FastStart領域を有効にした後の最初の移入または再移入中に、データベースによってFastStart領域が作成されます。

データベースでは、次のように、自動的にFastStart領域が管理されます。

  • オブジェクトの移入または再移入が行われるときは必ず、データベースによって、その列データがFastStart領域に書き込まれます。

    注意:

    データベースでは、FastStart表領域も暗号化されている場合のみ、暗号化された表領域からFastStart領域にセグメントが書き込まれます。

    領域管理ワーカー・プロセス(Wnnn)により、SYSDBinstance_name_LOBSEG$という名前のSecureFiles LOBにIMCU (IMEUやSMUではない)が書き込まれます。データベースにより、FastStartメタデータがSYSAUX表領域に書き込まれます。それらの表領域は、オンラインである必要があります。

    CUに対してどのくらいのDMLアクティビティが行われているかによって、FastStart領域内のCUとIM列ストア内のCUとの間でラグが存在することがあります。CUがホットなほど、データベースでそれをIM列ストアに移入してFastStart領域に書き込む頻度は少なくなります。データベースがクラッシュした場合は、IM列ストアに移入されたいくつかのCUがFastStart領域に存在しない場合があります。

    注意:

    FastStart領域が一時的にアクセス不可になった場合、インメモリー移入は影響を受けません。

  • セグメントに対してADOポリシーを定義した場合は、データベースで、そのポリシー内のルールに基づいて、FastStart領域内のセグメントが管理されます。たとえば、ADOにより、オブジェクトでポリシーに基づいてその属性がNO INMEMORYに変更されるよう指定した場合、IM列ストアで、そのデータがFastStart領域から削除されます。

  • 移入されたオブジェクトの属性がNOINMEMORYに変更されると、データベースで、自動的にそのIMCUがFastStart領域から削除されます。

  • FastStart表領域が領域不足になった場合は、データベースで、内部アルゴリズムを使用して最も古いセグメントが削除され、FastStart領域への書込みが続行されます。領域が残っていない場合は、データベースで、FastStart領域への書込みが停止されます。

次の図では、IM列ストアに移入されたproductscustomersおよびsalesを示します。

FastStart領域が有効になっている場合は、データベースで、これらのセグメントのIMCUがfs_tbs内のFastStart領域にも書き込まれます。データベースを再度開くかインスタンスを再起動すると、データベースで、変更できるようIMCUを有効にしてトランザクションの一貫性を確保し、IMCUを再使用できます。FastStart領域が有効になっているかどうかに関係なく、データベースにより、データ・ブロックおよびセグメントがディスク上のusers表領域内に格納されます。

注意:

データをFastStart表領域に書き込むよう、IM列ストアに手動で強制することはできません。

9.1.2.2 データベースでのFastStart領域からの読取り方

FastStart領域では、データベースを再度開いたときにどのデータをロードするかは定義されますが、いつロードするかは定義されません。移入は、優先順位設定によって制御されます。

データベースを再度開いたときに、標準のPRIORITYルールによって移入が決定されます。たとえば、データベースでは、要求に応じて、PRIORITY NONEが指定されているオブジェクトが移入されます。優先順位CRITICALが指定されているオブジェクトは、優先順位LOWが指定されているオブジェクトよりも、自動移入キュー内で高い位置にあります。

たとえば、単一インスタンスのデータベースで、salescustomersおよびproduct表が、PRIORITY NONEでIM列ストアに移入されます。どの再移入においても、データベースによって、これらの表のIMCUがFastStart領域に保存されます。そのインスタンスが予期せず終了したとします。データベースを再度開いたとき、IM列ストアは空になっています。問合せでsalescustomersまたはproduct表をスキャンした場合は、データベースにより、この表のIMCUがFastStart領域からIM列ストアにロードされます。

ほとんどの場合、FastStart領域により、移入の速度が向上します。ただし、FastStart領域に格納されているCUがDMLアクティビティの内部しきい値に達した場合は、データベースにより、FastStart領域からではなくデータ・ファイルから行データが移入されます。

9.2 IM列ストアに対するIMファスト・スタートの有効化

DBMS_INMEMORY_ADMIN.FASTSTART_ENABLEプロシージャを使用してFastStart領域のための表領域を指定します。

必要な場合は、FastStart領域のために作成されたLOBのロギング・モードを設定します。nologgingパラメータがTRUE (デフォルト)に設定されている場合は、データベースにより、NOLOGGINGオプションを指定してLOBが作成されます。nologgingFALSEに設定されている場合は、データベースにより、LOGGINGオプションを指定してFastStart LOBが作成されます。

前提条件

FastStart領域を作成するには、次の前提条件を満たしている必要があります。

  • FastStart領域として指定される表領域が存在する必要があります。

  • この表領域には、IM列ストアのデータを格納するための十分な領域がある必要があり、FastStart領域として指定される前に他のデータが含まれていてはなりません。INMEMORY_SIZE設定の2倍の大きさでFastStart表領域を作成することをお薦めします。

  • 管理者権限が必要です。

IM FastStart領域を作成するには、次の手順を実行します。

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. DBMS_INMEMORY_ADMIN.FASTSTART_ENABLEプロシージャを使用します。

例9-1 IM FastStart領域の指定

この例では、表領域を作成し、それをFastStart領域として指定します。

  1. SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。

  2. fs_tbsという名前の表領域を作成します。

    CREATE TABLESPACE fs_tbs
      DATAFILE 'fs_tbs.dbf' SIZE 500M REUSE
      AUTOEXTEND ON NEXT 500K MAXSIZE 1G;
    
  3. IMファスト・スタートを有効にし、デフォルトのNOLOGGINGオプションをFastStart LOBに対して使用して、fs_tbs表領域をFastStart領域として指定します。

    EXEC DBMS_INMEMORY_ADMIN.FASTSTART_ENABLE('fs_tbs');
  4. FastStart領域のステータスおよびサイズを問い合せます。

    COL TABLESPACE_NAME FORMAT a15
    
    SELECT TABLESPACE_NAME, STATUS,
           ( (ALLOCATED_SIZE/1024) / 1024 ) AS ALLOC_MB,
           ( (USED_SIZE/1024) / 1024 ) AS USED_MB
    FROM   V$INMEMORY_FASTSTART_AREA;
    
    TABLESPACE_NAME STATUS                 ALLOC_MB    USED_MB
    --------------- -------------------- ---------- ----------
    FS_TBS          ENABLE                      500      .0625

    この段階では、FastStart領域にユーザー・データはありません。

  5. FastStart LOBのロギング・モードを問い合せます。

    COL SEGMENT_NAME FORMAT a20
    SELECT SEGMENT_NAME, LOGGING 
    FROM   DBA_LOBS 
    WHERE  TABLESPACE_NAME = 'FS_TBS';
    
    SEGMENT_NAME         LOGGING
    -------------------- -------
    SYSDBIMFS_LOBSEG$    NO
    
  6. 現在移入されているオブジェクトの再移入をIM列ストアに強制します。

    次の問合せでは、salesproductsおよびcustomers表の再移入が強制的に実行されます。

    SELECT /*+ FULL(s) NO_PARALLEL(s) */ COUNT(*) FROM sh.sales s;
    SELECT /*+ FULL(p) NO_PARALLEL(p) */ COUNT(*) FROM sh.products p;
    SELECT /*+ FULL(c) NO_PARALLEL(c) */ COUNT(*) FROM sh.customers c;
  7. FastStart領域のサイズを問い合せます。

    COL TABLESPACE_NAME FORMAT a15
    
    SELECT TABLESPACE_NAME, STATUS,
           ( (ALLOCATED_SIZE/1024) / 1024 ) AS ALLOC_MB,
           ( (USED_SIZE/1024) / 1024 ) AS USED_MB
    FROM   V$INMEMORY_FASTSTART_AREA;
    
    TABLESPACE_NAME STATUS                 ALLOC_MB    USED_MB
    --------------- -------------------- ---------- ----------
    FS_TBS          ENABLE                      500       2.25
    

    ここでは、同じ問合せで、FastStart領域の2.25 MBが使用されていることが示されています。

関連項目:

DBMS_INMEMORY_ADMINパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

9.3 現在のIMファスト・スタート表領域の名前の取得

V$INMEMORY_FASTSTART_AREAビューを問い合せることで、現在FastStart領域として指定されている表領域の名前を取得します。

有効になっているFastStart表領域がない場合は、STATUS列にNOT ENABLEDと示されます。そうでない場合、この列には、表領域名が示されます。

前提条件

FastStart表領域の名前を取得するには、管理者権限が必要です。

FastStart表領域の名前を取得するには、次の手順を実行します。

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. V$INMEMORY_FASTSTART_AREAビューを問い合せます。

例9-2 現在のIMファスト・スタート表領域の名前の取得

この例では、FastStart表領域の名前およびステータスを問い合せます(出力例が含まれています)。

COL TABLESPACE_NAME FORMAT a20

SELECT TABLESPACE_NAME, STATUS 
FROM   V$INMEMORY_FASTSTART_AREA;

TABLESPACE_NAME      STATUS
-------------------- ----------
FS_TBS               ENABLE

関連項目:

V$INMEMORY_FASTSTART_AREAビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

9.4 別の表領域へのFastStart領域の移行

DBMS_INMEMORY_ADMINパッケージ内のFASTSTART_MIGRATE_STORAGEプロシージャを実行することにより、別の表領域にFastStart領域を移行できます。

非CDBまたはPDBでは、一度に1つの表領域のみをFastStart領域として指定できます。

前提条件

FastStart領域を移行するには、次の前提条件を満たしている必要があります。

  • 新しいFastStart領域として指定される表領域が存在する必要があります。

  • この表領域には、IM列ストアのデータを格納するための十分な領域がある必要があり、FastStart領域として指定される前に他のデータが含まれていてはなりません。

  • 管理者権限が必要です。

IM FastStart領域を移行するには、次の手順を実行します。

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. DBMS_INMEMORY_ADMIN.FASTSTART_MIGRATE_STORAGEプロシージャを実行します。

例9-3 別の表領域へのFastStart領域の移行

この例では、IM FastStart領域をnew_fs_tbs表領域に移行します。

  1. SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。

  2. 現在のFastStart表領域の名前を問い合せます。

    COL TABLESPACE_NAME FORMAT a15
    
    SELECT TABLESPACE_NAME, STATUS
    FROM   V$INMEMORY_FASTSTART_AREA;
    
    TABLESPACE_NAME STATUS
    --------------- -----------
    FS_TBS          ENABLE
    
  3. new_fs_tbsという名前の表領域を作成します。
    CREATE TABLESPACE new_fs_tbs
      DATAFILE 'new_fs_tbs.dbf' SIZE 500M REUSE
      AUTOEXTEND ON NEXT 500K MAXSIZE 1G;
    
  4. FastStart領域を新しい表領域に移行します。

    EXEC DBMS_INMEMORY_ADMIN.FASTSTART_MIGRATE_STORAGE('new_fs_tbs');
  5. 現在のFastStart表領域の名前を問い合せます。

    TABLESPACE_NAME      STATUS
    -------------------- --------------------
    NEW_FS_TBS           ENABLE

関連項目:

FASTSTART_MIGRATE_STORAGEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

9.5 IM列ストアに対するIMファスト・スタートの無効化

IMファスト・スタートを無効にした場合は、データベースでFastStart領域が保持されなくなります。データベースを再度開いたとき、データベースでIM列ストアの移入にIMファスト・スタートは使用されません。

前提条件

FastStart領域を無効にするには、次の条件を満たしている必要があります。

  • FastStart領域が有効になっている必要があります。

  • 管理者権限が必要です。

FastStart表領域を無効にするには、次の手順を実行します。

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. V$INMEMORY_FASTSTART_AREAを問い合せて、IM FastStart領域が有効になっていることを確認します。

  3. DBMS_INMEMORY_ADMIN.FASTSTART_DISABLEプロシージャを実行します。

  4. 必要な場合は、FastStart表領域を削除します。

例9-4 IMファスト・スタートの無効化

この例では、IM FastStart領域を無効にしてから、fs_tbs表領域を削除します。

  1. SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。

  2. FastStart領域のステータスを問い合せます。

    COL TABLESPACE_NAME FORMAT a15
    
    SELECT TABLESPACE_NAME, STATUS
    FROM   V$INMEMORY_FASTSTART_AREA;
    
    TABLESPACE_NAME STATUS
    --------------- -----------
    FS_TBS          ENABLE
    
  3. FastStart領域を無効にします。

    EXEC DBMS_INMEMORY_ADMIN.FASTSTART_DISABLE;
  4. FastStart領域のステータスを問い合せます。

    SELECT TABLESPACE_NAME, STATUS
    FROM   V$INMEMORY_FASTSTART_AREA;
    
    TABLESPACE_NAME      STATUS
    -------------------- --------------------
    INVALID_TABLESPACE   DISABLE

    IMファスト・スタートが有効になっている場合、TABLESPACE_NAMEの値はINVALID_TABLESPACEであり、STATUSの値はDISABLEです。

  5. 前のFastStart表領域を削除します。

    DROP TABLESPACE fs_tbs INCLUDING CONTENTS AND DATAFILES;

関連項目:

FASTSTART_DISABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。