4 ExadataでのOracle Databaseの管理

4.1 SQL処理のオフロードの管理

表スキャンおよび索引スキャンを実行する問合せのパフォーマンスを最適化するために、データベースではデータ検索および取得処理をExadataストレージ・サーバーにオフロードできます。この機能は、データベース初期化パラメータによって制御されます。

4.1.1 CELL_OFFLOAD_PROCESSING

CELL_OFFLOAD_PROCESSING初期化パラメータでは、SQL処理をOracle Exadata Storage Serverにオフロードできます。

パラメータの値をTRUEに設定すると、条件評価をセルにオフロードできます。このパラメータのデフォルト値はTRUEです。セッション・レベルまたはシステム・レベルでパラメータの値をFALSEに設定すると、データベースでは、ブロックを使用するセルですべての条件評価が実行されます。SQLのALTER SYSTEMコマンドまたはALTER SESSIONコマンドを使用すると、CELL_OFFLOAD_PROCESSINGを動的に設定できます。次に例を示します。

SQL> ALTER SESSION SET CELL_OFFLOAD_PROCESSING = TRUE;

OPT_PARAMオプティマイザ・ヒントを使用してCELL_OFFLOAD_PROCESSINGパラメータを設定することもできます。これにより、特定のSQLコマンドで条件のフィルタ処理の有効/無効を切り替えることができます。

  • SQLコマンドのCELL_OFFLOAD_PROCESSINGを無効にするには:

    SELECT /*+ OPT_PARAM('cell_offload_processing' 'false') */ COUNT(*) FROM EMPLOYEES;
    
  • SQLコマンドのCELL_OFFLOAD_PROCESSINGを有効にするには:

    SELECT /*+ OPT_PARAM('cell_offload_processing' 'true') */ COUNT(*) FROM EMPLOYEES;
    

ノート:

CELL_OFFLOAD_PROCESSING初期化パラメータを使用して、Oracle Exadata Storage Serverと従来型のストレージのパフォーマンスを比較することはできません。CELL_OFFLOAD_PROCESSINGをFALSEに設定した場合でも、Oracle Exadata Storage Serverには従来型のストレージよりも多くの利点があります。Oracle Exadata Storage Serverは、サイズの大きい問合せを高速に処理できるように最適化されています。セル内にコントローラまたはその他のレベルのボトルネックが発生することはありません。Oracle Exadata System Softwareでは、最新のスケールアウト・アーキテクチャと、従来型のストレージ・ネットワークよりも非常に高いスループットを可能にするInfiniBandネットワークを使用しています。Oracle Exadata System SoftwareOracle Databaseと密接に統合されており、設定、実行、監視、診断、リソース管理および破損防止のための独自の機能が用意されています。

4.1.2 CELL_OFFLOAD_PLAN_DISPLAY

データベース・パラメータのCELL_OFFLOAD_PLAN_DISPLAYでは、Oracle Exadata System Softwareで評価可能な条件を、SQLコマンドのSTORAGE条件としてSQL EXPLAIN PLANコマンドで表示するかどうかを指定します。

CELL_OFFLOAD_PLAN_DISPLAYパラメータの値は、AUTOALWAYSNEVERです。デフォルト値はAUTOです。

  • AUTOでは、SQL EXPLAIN PLANコマンドに、STORAGEとして評価できる条件を表示するように指示します(セルが存在する場合で、そのセルに表がある場合のみ)。

  • ALWAYSは、Oracle Exadata System Softwareが存在するか、または表がセル上にあるかどうかとは関係なく、Oracle Exadata System Softwareに基づいてSQL EXPLAIN PLANコマンドに対する変更を作成します。この設定を使用して、Oracle Exadata Storage Serverに移行する前にOracle Exadata Storage Serverにオフロード可能な内容を確認できます。

  • NEVERでは、Oracle Exadata System Softwareに関してSQL EXPLAIN PLANコマンドは変更されません。

SQLのALTER SYSTEMコマンドまたはALTER SESSIONコマンドを使用すると、CELL_OFFLOAD_PLAN_DISPLAYパラメータを動的に設定できます。次に例を示します。

SQL> ALTER SESSION SET cell_offload_plan_display = ALWAYS;

4.1.3 CELL_OFFLOAD_DECRYPTION

CELL_OFFLOAD_DECRYPTION初期化パラメータでは、復号化をOracle Exadata Storage Serverにオフロードできます。この復号化は、暗号化された表領域と列の両方に適用されます。パラメータの値をTRUEに設定すると、復号化をセルにオフロードできます。このパラメータのデフォルト値はTRUEです。システム・レベルでパラメータの値をFALSEに設定すると、データベースでは、ブロックを使用するセルですべての復号化が実行されます。SQL ALTER SYSTEMコマンドを使用すると、CELL_OFFLOAD_DECRYPTIONを動的に設定できます。次に例を示します。

SQL> ALTER SYSTEM SET CELL_OFFLOAD_DECRYPTION = FALSE;

4.2 デフォルトのキャッシュ・ポリシーのオーバーライド

通常は必要ありませんが、CELL_FLASH_CACHEセグメント記憶域オプションを使用して、Exadataスマート・フラッシュ・キャッシュの自動キャッシング・ポリシーをオーバーライドできます。

CELL_FLASH_CACHEオプションは、次の設定をサポートしています。

  • NONE: この値により、Exadataスマート・フラッシュ・キャッシュは対応するセグメントをキャッシュしなくなります。周辺のデータベース・セグメントでこの設定を使用すると、より重要でアクセス頻度の高いデータベース・セグメントで、より多くのキャッシュ領域を使用できます。
  • DEFAULT: この値を指定すると、データベース・セグメントは、Exadataスマート・フラッシュ・キャッシュのデフォルトのLRU (最低使用頻度)アルゴリズムを使用してキャッシュされます。この値は、CELL_FLASH_CACHEのデフォルト設定です。
  • KEEP: この値は、Exadataスマート・フラッシュ・キャッシュのセグメント優先度を高くします。この設定を使用すると、キャッシュ内の対応するセグメントのデータが保持される可能性を高めることができます。

例4-1 CELL_FLASH_CACHEと組み合せたCREATE TABLEの使用

STORAGE句は、表または他のオブジェクトに対するCREATEおよびALTERコマンドの実行時に指定できます。この例は、STORAGE句でCELL_FLASH_CACHEを使用するCREATE TABLEコマンドの例を示しています。

CREATE TABLE ptable (c1 number, c2 clob) TABLESPACE TBS_1
          PARTITION BY RANGE(c1) ( PARTITION p1 VALUES LESS THAN (100)
             TABLESPACE TBS_2 STORAGE (CELL_FLASH_CACHE DEFAULT),
          PARTITION p2 VALUES LESS THAN (200) TABLESPACE TBS_3
             STORAGE (CELL_FLASH_CACHE KEEP));

CREATE TABLE tkbcsrbc (c1 number, l1 clob)
           lob (l1) STORE AS securefile 
              (cache nologging STORAGE (CELL_FLASH_CACHE NONE))
           PCTFREE 0 TABLESPACE tbs_93 STORAGE 
              (initial 128K next 128K pctincrease 0);

例4-2 CELL_FLASH_CACHEと組み合せたALTER TABLEの使用

STORAGE句の変更が許可されるオブジェクトの場合、この例に示すように、CELL_FLASH_CACHEと組み合せてALTERコマンドを使用できます。

ALTER TABLE tkbcsrbc STORAGE( CELL_FLASH_CACHE DEFAULT);

ALTER TABLE tkbcsrbc MODIFY LOB (l1) (STORAGE (CELL_FLASH_CACHE KEEP));

例4-3 ビューを使用したCELL_FLASH_CACHE STORAGE句の問合せ

CELL_FLASH_CACHE STORAGE句属性は、関連するオブジェクトに基づいたデータベース・ビューを使用して問い合せることができます。

SELECT TABLESPACE_NAME, TABLE_NAME, CELL_FLASH_CACHE FROM user_tables WHERE table_name='TKBCSRBC';

SELECT CELL_FLASH_CACHE FROM ALL_INDEXES WHERE index_name='TKBCIDX';

4.3 インメモリー列指向キャッシングの管理

列キャッシュは、データを列形式で格納するExadataスマート・フラッシュ・キャッシュのセクションです。Oracle Databaseから指示された場合、Exadataは列キャッシュの一部を自動的に使用して、Oracle Database In-Memory形式でデータを保持します。この拡張機能を使用するためにExadataで必要な構成は何もありません。

この機能は、Oracle Database In-Memoryオプションのライセンスを所有している場合に使用可能です。この機能を有効にするには、次のいずれかのデータベース・インスタンス・パラメータを使用します。

  • INMEMORY_SIZEデータベース・インスタンス・パラメータをゼロより大きい値に設定します。

  • Oracle Databaseバージョン19.8.0.0.200714以降、INMEMORY_FORCE=cellmemory_levelを設定できます。

    このオプションを使用すると、データベース・インスタンスで専用のインメモリー・キャッシュを使用せずに、Exadataスマート・フラッシュ・キャッシュでインメモリー列指向キャッシングを使用できます。

CELLMEMORYセグメント・オプションを使用して、Exadataスマート・フラッシュ・キャッシュのインメモリー列指向キャッシングのデフォルトの動作をオーバーライドできます。

SQL> ALTER TABLE table_name  [ [ NO ] CELLMEMORY [ MEMCOMPRESS FOR [ QUERY | CAPACITY ] [ LOW | HIGH ] ]
オプションおよび句 使用方法の説明
NO CELLMEMORY 表が12.1.0.2の列指向のフラッシュ・キャッシュ形式から12.2のDatabase In-Memory形式への書換え対象外であることを示します。
CELLMEMORYおよびCELLMEMORY MEMCOMPRESS FOR CAPACITY 表をデフォルトのOracle Database 12.2 In-Memoryの形式でキャッシュできます。以前に指定したNO CELLMEMORY文を取り消すか、指定した圧縮レベルを変更する場合のみ、この句を使用する必要があります。 
CELLMEMORY MEMCOMPRESS FOR QUERY このオプションは、MEMCOMPRESS FOR CAPACITYが指定された場合、インメモリー列ストアのデータをそれを下回るように圧縮する必要があることを示します。このオプションにより、問合せ時のパフォーマンスが向上しますが、約2倍のフラッシュ領域が必要です。
LOWおよびHIGH 現時点では実装されていません。

例4-4 同じ表でのCELLMEMORYおよびINMEMORYオプションの使用

INMEMORYCELLMEMORYの両方を同じ表で使用できます。次に例を示します。

CREATE TABLE t (c1 NUMBER) INMEMORY CELLMEMORY MEMCOMPRESS FOR QUERY;

メモリーにロードされそうにない、優先順位の低い表がある場合に、これら2つのオプションを指定すると便利です。また、CELLMEMORYを指定することでも、列指向の性能を得られます。

4.4 Exadataハイブリッド列圧縮の管理

次の手順を使用して、Exadataハイブリッド列圧縮を使用するOracle Databaseオブジェクトを管理します。

4.4.1 表が圧縮されているかどうかの確認

表またはパーティションが圧縮されているかどうかを確認するには、*_TABLESまたは*_TAB_PARTITIONSデータ・ディクショナリ・ビューを問い合せます。

  • 表の圧縮を判断するには、*_TABLESデータ・ディクショナリ・ビューを問い合せます。

    *_TABLESデータ・ディクショナリ・ビューで、圧縮表にはCOMPRESSION列にENABLEDと表示されます。

    SQL> SELECT table_name, compression, compress_for FROM user_tables;
     
    TABLE_NAME       COMPRESSION   COMPRESS_FOR
    ---------------- ------------  -----------------
    T1               DISABLED
    T2               ENABLED       BASIC
    T3               ENABLED       OLTP
    T4               ENABLED       QUERY HIGH
    T5               ENABLED       ARCHIVE LOW
    パーティション表の場合、*_TABLESデータ・ディクショナリ・ビューのCOMPRESSION列はNULLです。
  • パーティション表の場合、*_TAB_PARTITIONSデータ・ディクショナリ・ビューを問い合せます。

    *_TAB_PARTITIONSビューのCOMPRESSION列に、圧縮されているパーティション表が表示されます。COMPRESS_FOR列には、表またはパーティションで使用中の圧縮方法が表示されます。

    SQL> SELECT table_name, partition_name, compression, compress_for
      FROM user_tab_partitions;
    
    TABLE_NAME  PARTITION_NAME   COMPRESSION   COMPRESS_FOR
    ----------- ---------------- -----------   ------------------------------
    SALES       Q4_2004          ENABLED       ARCHIVE HIGH
      ...
    SALES       Q3_2008          ENABLED       QUERY HIGH
    SALES       Q4_2008          ENABLED       QUERY HIGH
    SALES       Q1_2009          ENABLED       OLTP
    SALES       Q2_2009          ENABLED       OLTP

4.4.2 圧縮されている行の確認

Exadataハイブリッド列圧縮表が更新されると、行は下位レベルの圧縮に変更されます。

たとえば、圧縮レベルがCOMP_FOR_QUERY_HIGHからCOMP_FOR_OLTPまたはCOMP_NOCOMPRESSに変更される場合があります。

表の行をサンプリングすることで、高レベルの圧縮ではなくなった行の割合を確認できます。

  • 次の問合せを使用して、行の圧縮レベルを判断します。
    DBMS_COMPRESSION.GET_COMPRESSION_TYPE (
       ownname    IN    VARCHAR2, 
       tabname    IN    VARCHAR2, 
       row_id     IN    ROWID)
      RETURN NUMBER;
ALTER TABLEまたはMOVE PARTITIONを使用すると、行をより高い圧縮レベルに設定できます。たとえば、行の10%が最高の圧縮レベルでなくなった場合、それらの行をより高い圧縮レベルに変更または移行できます。

4.4.3 圧縮レベルの変更

パーティション、表または表領域の圧縮レベルは変更できます。

次の例では、圧縮レベルを変更する場合のシナリオについて説明します。

ある企業では、その売上データにウェアハウス圧縮を使用していますが、6か月より古い売上データにはめったにアクセスしません。売上データがその経過時間に基づいてパーティション化された表に格納されている場合、古いデータの圧縮レベルをアーカイブ圧縮に変更して、ディスク領域を解放できます。

  • パーティション表の圧縮レベルを変更するには、DBMS_REDEFINITIONパッケージを使用します。

    このパッケージでは、表の再定義をオンラインで実行するために、再定義中に表のデータを保持する一時コピーを作成します。再定義される表は、再定義中でも引き続き問合せやDML文に対応できます。オンラインでの表の再定義に使用される空き領域の容量は、既存の表と新しい表の相対的な圧縮レベルに応じて変化します。DBMS_REDEFINITIONパッケージを使用する前に、システム上に十分なハード・ディスク領域が存在することを確認してください。

  • パーティション表の単一パーティションの圧縮レベルを変更するには、ALTER TABLE ... MODIFY PARTITIONコマンドを使用します。

  • 非パーティション表の圧縮レベルを変更するには、COMPRESS FOR句を指定してALTER TABLE ... MOVEコマンドを使用します。

    ALTER TABLE ... MOVEコマンドの実行中に表に対してDML文を実行するには、ONLINE句も追加する必要があります。

  • 表領域の圧縮レベルを変更するには、ALTER TABLESPACEコマンドを使用します。

    これにより、表領域に作成される新規オブジェクトのデフォルトが定義されます。既存のオブジェクトは変更も移動も行われません。

  • 自動データ最適化(ADO)を使用して、圧縮レベルを自動的に調整するポリシーを作成できます。

4.4.4 Exadataハイブリッド列圧縮表のインポートおよびエクスポート

impdpおよびexpdpコマンドを使用して、Exadataハイブリッド列圧縮表をインポートおよびエクスポートできます。

Exadataハイブリッド列圧縮表は、データ・ポンプのインポート・ユーティリティのimpdpコマンドを使用してインポートできます。デフォルトでは、impdpコマンドは表プロパティを保存し、インポートされた表はExadataハイブリッド列圧縮表となります。表はexpdpコマンドでエクスポートすることもできます。

Exadataハイブリッド列圧縮をサポートしていない表領域では、impdpコマンドは失敗し、次のエラーが表示されます。

ORA-64307: Exadata Hybrid Columnar Compression is not supported for tablespaces on this storage type

Exadataハイブリッド列圧縮表は、impdpコマンドのTRANSFORM:SEGMENT_ATTRIBUTES=nオプション句を使用して、非圧縮表としてインポートできます。

非圧縮表またはOLTP圧縮表は、インポート中にExadataハイブリッド列圧縮形式に変換できます。Exadata以外のハイブリッド列圧縮表をExadataハイブリッド列圧縮表に変換するには、次のようにします。

  1. ALTER TABLESPACE ... SET DEFAULT COMPRESSコマンドを使用して、表領域のデフォルト圧縮を指定します。
  2. インポート中にインポートされた表のSEGMENT_ATTRIBUTESオプションを上書きします。

4.4.5 Exadataハイブリッド列圧縮表のリストア

圧縮表バックアップはExadataハイブリッド列圧縮をサポートしているシステム、またはExadataハイブリッド列圧縮をサポートしていないシステムにリストアできます。

  • Exadataハイブリッド列圧縮が含まれる表をExadataハイブリッド列圧縮をサポートしているシステムにリストアする場合は、通常どおり、Oracle Recovery Manager (RMAN)を使用してファイルをリストアします。

  • Exadataハイブリッド列圧縮表がExadataハイブリッド列圧縮をサポートしていないシステムにリストアされる場合は、表をExadataハイブリッド列圧縮から非圧縮形式に変換する必要があります。

次のステップを使用して、Exadataハイブリッド列圧縮表を非圧縮形式に変換します。

  1. データを非圧縮形式で格納するのに十分な領域があることを確認します。
  2. RMANを使用して、Exadataハイブリッド列圧縮表領域をリストアします。
  3. 表圧縮をExadataハイブリッド列圧縮からNOCOMPRESSに変更します。

    次に例を示します。

    SQL> ALTER TABLE table_name MOVE ONLINE NOCOMPRESS;

    また、次のコマンドを使用して、データを並列で移動することもできます。

    SQL> ALTER TABLE table_name MOVE ONLINE NOCOMPRESS PARALLEL;

    表がパーティション化されている場合、各パーティションの圧縮方法を個別に変更します。次に例を示します。

    SQL> ALTER TABLE table_name MOVE PARTITION partition_name NOCOMPRESS ONLINE;

表を非圧縮形式に変換した後、OLTP圧縮やOracle Database In-Memory圧縮などの別の形式の圧縮をオプションで使用できます。

4.5 ExadataでのOracle Database機能の管理

Oracle Exadata Database Machineと組み合せて次のOracle Database機能を使用および管理するには、これらのガイドラインを使用します。

4.5.1 Exadataでの索引の使用

以前は、適切なパフォーマンスを得るにはデータベースに索引が必要でした。しかし、Oracle Exadata Database Machineでは、索引を使用せずに優れたスキャン率を実現できます。

Exadataスマート・スキャンのオフロードを使用して実行計画が高速になるかどうかを判断するには、索引を使用するアプリケーションの実行計画を確認します。索引がなくてもスキャンが高速になるかどうかを判断するには、オプティマイザで索引を認識できないようにします。認識されない索引はDML操作によって管理されますが、オプティマイザでは使用されません。

索引が認識されないようにするには、次のコマンドを使用し、index_nameのかわりに索引名を使用します。

SQL> ALTER INDEX index_name INVISIBLE;

4.5.2 ExadataでのSQLチューニング・アドバイザの使用

SQLチューニング・アドバイザでは、1つ以上のSQL文を入力として使用し、自動チューニング・オプティマイザを使用してSQL文のチューニングを実行します。

SQLチューニング・アドバイザの実行結果は、アドバイスまたは推奨事項の形式で出力され、推奨事項ごとに論理的根拠および予想される利点が示されます。SQLチューニング・アドバイザでは、次の情報が提供されます。

  • データ不足の統計や古い統計

  • 最適な実行計画

  • 最適なアクセス・パスおよびオブジェクト

  • 最適なSQL文

システム統計によってCPUと記憶域のパフォーマンスが測定され、オプティマイザでプランを評価する際にこれらの入力を使用できます。データベースでは、インスタンスが最初に起動したときに非作業負荷統計と呼ばれるデフォルトのシステム統計が自動的に収集されます。システム統計により、Oracle Exadata Database Machineのパフォーマンスがオプティマイザで認識されるようになります。

Oracle Exadata固有の統計を収集しているかどうかを確認するには、次のSQLコマンドを使用します。

SELECT pname, PVAL1  FROM aux_stats$ WHERE pname='MBRC';

PVAL1がNULLまたは未設定の場合は、システム統計が手動で収集されておらず、デフォルトのシステム統計が使用されています。

すべてのExadata環境でシステム統計をExadataモードで収集することはお薦めしません。ほとんどの場合、デフォルトのシステム統計を使用することをお薦めします。現在の実行プランで許容可能なパフォーマンスが得られる場合は、Exadataモードでシステム統計を収集しないでください。実行プランのカーディナリティの見積りは正確だが、全体スキャンの方が効率的な状況でオプティマイザが全表スキャンのコストを過大に見積る場合は、システム統計をExadataモードで収集する必要があります。影響が最初から評価され、問題が発生しても簡単に対処できる新しいアプリケーションやデプロイメントの場合は、システム統計をExadataモードで収集できます。

次のSQLコマンドは、Exadataモードでシステム統計を収集します。

exec dbms_stats.gather_system_stats('EXADATA');

新しいアプリケーションまたは新しいデプロイメントのテストで、デフォルトのシステム統計が手動で収集されたシステム統計と同じかそれ以上に効率的であることが明らかになった場合は、DBMS_STATS.DELETE_SYSTEM_STATSプロシージャを使用してシステム統計をデフォルト値にリセットできます。このプロシージャを実行した後、データベースを停止してから再度開いてください。

ノート:

Oracle Exadata System Softwareが最新のパッチ・バンドルを使用している必要があります。

4.5.3 ExadataでのSQL計画管理の使用

SQL計画管理は、長期間にわたってSQL文の実行計画を記録し評価することで、SQL文の実行計画の突然の変更によってパフォーマンスが低下するのを防止します。

SQL計画管理を使用して、効果的であることが判明している既存の計画セットで構成されるSQL計画ベースラインを作成します。次にSQL計画ベースラインを使用して、システムで発生する変更(ソフトウェアのアップグレードや新しいアプリケーション・モジュールのデプロイなど)とは無関係に、対応するSQL文のパフォーマンスを保持します。

SQL計画管理を使用して、新しいオプティマイザ統計や索引などの変更に適切に適応させることもできます。パフォーマンスを向上させる計画変更のみを検証して受け入れることができます。SQL計画の展開は、オプティマイザが新しい計画を検証して既存のSQL計画ベースラインに追加するためのプロセスです。

SQLプロファイルとSQL計画ベースラインのどちらも、オプティマイザで最適な計画のみが使用されるようにすることによりSQL文のパフォーマンスを向上させます。通常、SQL計画ベースラインは重大なパフォーマンスの問題が発生する前に作成します。SQL計画ベースラインは、オプティマイザが最適ではない計画を将来的に使用することを防ぎます。SQLプロファイルは、SQLチューニング・アドバイザを起動するとデータベースにより作成されます。通常、チューニング・アドバイザは、SQL文により高負荷の兆候が示された後にのみ起動します。SQLプロファイルは主に、最適ではない計画につながったオプティマイザのミスを継続的に解決するために使用できます。

DBMS_SPMパッケージは、様々なSQL文に対して保持される、計画履歴およびSQL計画ベースラインに対する制御された操作を実行するためのインタフェースをユーザーに提供することによって、SQL計画管理機能をサポートします。DBMS_SPMパッケージは、計画の展開で使用できるプロシージャとファンクションを提供します。

Oracle Exadata System Softwareリリース19.1以降では、DBMS_SPM.CONFIGUREに新しいパラメータAUTO_SPM_EVOLVE_TASKが用意されており、これはExadata Database MachineオンプレミスおよびOracle Cloudデプロイメントのみで使用できます。AUTO_SPM_EVOLVE_TASKパラメータには、次の3つの値のいずれかを指定できます。

  • ON: この機能が有効になります。SPM展開アドバイザにより、SQL計画履歴を定期的に管理するタスクが作成されます。このタスクでは、代替の有無を確認し、SQL実行計画を展開して受け入れる必要があるかどうかを判断します。このタスクは、高頻度統計収集と同様の方法で、通常のメンテナンス・ウィンドウの外部で実行されます。
  • OFF: この機能は無効になります。これはデフォルト値です。
  • AUTO: Oracle Databaseがこの機能を使用するタイミングを決定します。