4 インメモリー移入に対するオブジェクトの有効化
この章では、圧縮や優先順位のオプションの設定を含め、IM列ストアへの移入に対してオブジェクトを有効および無効にする方法を説明します。
この章のトピックは、次のとおりです:
4.1 インメモリー移入について
インメモリー移入(移入)は、データベースでディスクから既存の行形式データを読み取り、それを列形式に変換し、IM列ストアに格納するときに起こります。
INMEMORY
属性を使用するオブジェクトのみが移入の候補となります。
この項では、次の項目について説明します。
4.1.1 インメモリー移入の目的
IM列ストアでは、データベース内のすべてのオブジェクトがIM列ストアに自動的にロードされるわけではありません。
DDLを使用してオブジェクトをINMEMORY
として指定しない場合、IM列ストアは空のままとなります。移入は、分析問合せに使用できるよう、行をユーザー指定のINMEMORY
オブジェクトから列形式に変換するために必要です。
移入は、ディスク上の既存のデータを列形式に変換するものであり、新しいデータをIM列ストアにロードする、再移入とは異なります。IMCUは読取り専用の構造であるため、Oracle Databaseでは、それらは行の変更時に移入されません。正確に述べると、データベースでは、行変更がトランザクション・ジャーナルに記録されてから、再移入の一環として新しいIMCUが作成されます。
関連トピック
4.1.2 インメモリー移入はどのように機能するか
データベース・インスタンス起動時またはINMEMORY
オブジェクトへのアクセス時のどちらかにデータベースによってオブジェクトがIM列ストアに移入されるよう指定できます。
移入アルゴリズムは、単一インスタンスまたはOracle RACのどちらを使用するかによっても異なります。
この項では、次の項目について説明します。
4.1.2.1 インメモリー移入の優先順位付け
DDL文には、移入キューをより細かく制御できるようにするINMEMORY PRIORITY
副句が含まれています。
ノート:
INMEMORY PRIORITY
副句は、移入の速度ではなく、移入の優先順位を制御します。
優先度レベル設定は、別々の列サブセットではなく、全体の表、パーティションまたはサブパーティションに適用されます。オブジェクト上でINMEMORY
属性を設定することは、このオブジェクトがIM列ストアへの移入の候補であることを意味します。データベースでそのオブジェクトがすぐに移入されることを意味するわけではありません。
ノート:
ディスク上のセグメントが64KB以下の場合、IM列ストアに移入されません。したがって、IM列ストアに対して有効になっている小規模データベース・オブジェクトは、移入されないことがあります。
Oracle Databaseでは、次のように優先順位付けが管理されます。
-
オンデマンド移入
デフォルトでは、
INMEMORY PRIORITY
パラメータはNONE
に設定されています。この場合、データベースでは、オブジェクトは表の全体スキャンを通じてアクセスされるときのみ移入されます。オブジェクトがアクセスされることがないか、索引スキャンまたはROWIDによるフェッチを通じてしかアクセスされない場合は、移入が起こることはありません。 -
優先度ベース移入
PRIORITY
がNONE
以外の値に設定されている場合、Oracle databaseでは、内部的に管理される優先順位キーを使用して、オブジェクトが自動的に移入されます。この場合、全体スキャンは、移入に必要な条件ではありません。データベースでは、次のことが実行されます。-
データベース・インスタンスの再起動後に、列データをIM列ストアに自動的に移入します
-
指定された優先度レベルに基づいて、
INMEMORY
オブジェクトの移入を問い合せますたとえば、
INMEMORY PRIORITY CRITICAL
で変更された表はINMEMORY PRIORITY HIGH
で変更された表よりも優先され、この表もまた、INMEMORY PRIORITY LOW
で変更された表よりも優先されます。IM列ストアに十分な領域がない場合、Oracle Databaseは領域が使用可能になるまで追加オブジェクトを移入しません。 -
オブジェクトに対する変更がIM列ストアで記録されるまで、
ALTER TABLE
またはALTER MATERIALIZED VIEW
文からの返答を待機します
-
セグメントがIM列ストアに移入された後、データベースでそれが除去されるのは、そのセグメントが削除または移動されるか、NO INMEMORY
属性で更新されるときのみです。セグメントは手動またはADOポリシーによって除去できます。
例4-1 IM列ストアへのオブジェクトの移入
この例を完了する前に、IM列ストアをデータベースに対して有効にする必要があります。
-
データベースに管理者としてログインしてから、次のように
customers
表を問い合せます。SELECT cust_id, cust_last_name, cust_first_name FROM sh.customers WHERE cust_city = 'Hyderabad' AND cust_income_level LIKE 'C%' AND cust_year_of_birth > 1960;
-
問合せの実行計画を表示します。
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'+ALLSTATS')); SQL_ID frgk9dbaftmm9, child number 0 ------------------------------------- SELECT cust_id, cust_last_name, cust_first_name FROM sh.customers WHERE cust_city = 'Hyderabad' AND cust_income_level LIKE 'C%' AND cust_year_of_birth > 1960 Plan hash value: 2008213504 ------------------------------------------------------------------------------- | Id| Operation | Name |Starts|E-Rows|A-Rows| A-Time |Buffers| ------------------------------------------------------------------------------- | 0| SELECT STATEMENT | | 1| | 6 |00:00:00.01 | 1523| |* 1| TABLE ACCESS FULL| CUSTOMERS | 1| 6 | 6 |00:00:00.01 | 1523| ------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(("CUST_CITY"='Hyderabad' AND "CUST_YEAR_OF_BIRTH">1960 AND "CUST_INCOME_LEVEL" LIKE 'C%'))
-
sh.customers
表をIM列ストアへの移入のために有効にします。ALTER TABLE sh.customers INMEMORY;
上の文では、デフォルトの優先順位である
NONE
が使用されます。優先順位なしでオブジェクトを移入するには、全体スキャンが必要となります。 -
sh.customers
表からのデータがIM列ストアに移入されているかどうかを判断するには、次の問合せを実行します(出力例が含まれています)。SELECT SEGMENT_NAME, POPULATE_STATUS FROM V$IM_SEGMENTS WHERE SEGMENT_NAME = 'CUSTOMERS'; no rows selected
この場合、
sh.customers
表はまだスキャンされていないため、IM列ストアに移入されているセグメントはありません。 -
ステップ1と同じ文を使用して
sh.customers
を問い合せます。SELECT cust_id, cust_last_name, cust_first_name FROM sh.customers WHERE cust_city = 'Hyderabad' AND cust_income_level LIKE 'C%' AND cust_year_of_birth > 1960;
-
カーソルの問合せでは、データベースで全体スキャンを実行しIM列ストアにアクセスしたことが示されます。
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'+ALLSTATS')); SQL_ID frgk9dbaftmm9, child number 0 ------------------------------------- SELECT cust_id, cust_last_name, cust_first_name FROM sh.customers WHERE cust_city = 'Hyderabad' AND cust_income_level LIKE 'C%' AND cust_year_of_birth > 1960 Plan hash value: 2008213504 --------------------------------------------------------------------------------- | Id| Operation | Name |Starts|E-Rows|A-Rows|A-Time|Buffers| --------------------------------------------------------------------------------- | 0| SELECT STATEMENT | | 1| | 6 |00:00:00.02| 1523 | |* 1| TABLE ACCESS INMEMORY FULL| CUSTOMERS | 1| 6| 6 |00:00:00.02| 1523 | --------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - inmemory(("CUST_CITY"='Hyderabad' AND "CUST_YEAR_OF_BIRTH">1960 AND "CUST_INCOME_LEVEL" LIKE 'C%')) filter(("CUST_CITY"='Hyderabad' AND "CUST_YEAR_OF_BIRTH">1960 AND "CUST_INCOME_LEVEL" LIKE 'C%'))
-
V$IM_SEGMENTS
を再度問い合せます(出力例が含まれています)。COL SEGMENT_NAME FORMAT a20 SELECT SEGMENT_NAME, POPULATE_STATUS FROM V$IM_SEGMENTS WHERE SEGMENT_NAME = 'CUSTOMERS'; SEGMENT_NAME POPULATE_STATUS -------------------- --------------- CUSTOMERS COMPLETED
POPULATE_STATUS
内の値COMPLETED
は、表がIM列ストアに移入されていることを意味します。 -
DBA_FEATURE_USAGE_STATISTICS
ビューでは、データベースでIM列ストアを使用して結果を取得したことを確認します。COL NAME FORMAT a25 SELECT ul.NAME, ul.DETECTED_USAGES FROM DBA_FEATURE_USAGE_STATISTICS ul WHERE ul.VERSION= (SELECT MAX(u2.VERSION) FROM DBA_FEATURE_USAGE_STATISTICS u2 WHERE u2.NAME = ul.NAME AND ul.NAME LIKE '%Column Store%'); NAME DETECTED_USAGES ------------------------- --------------- In-Memory Column Store 1
4.1.2.2 バックグラウンド・プロセスによるIMCUの移入方法
移入中、データベースは、行形式でディスクからデータを読み取り、列を作成するために行をピボットし、インメモリー圧縮ユニット(IMCU)にデータを圧縮します。
ワーカー・プロセス(Wnnn)は、IM列ストアにデータを移入します。各ワーカー・プロセスは、オブジェクトのデータベース・ブロックのサブセットで動作します。移入は、データを同時に圧縮して列形式に変換する、ストリーミング・メカニズムです。
INMEMORY_MAX_POPULATE_SERVERS
初期化パラメータにより、IM列ストアの移入に使用するワーカー・プロセスの最大数を指定します。デフォルト設定は、CPU_COUNT
の2分の1です。このパラメータは環境に適した値に設定します。ワーカー・プロセスの数を増加すると移入は高速化しますが、より多くのCPUリソースが使用されます。ワーカー・プロセスの数を削減すると、移入が低速化し、これによりCPUオーバーヘッドは低減します。
ノート:
INMEMORY_MAX_POPULATE_SERVERS
が0
に設定されている場合、移入は無効化されます。
関連項目:
INMEMORY_MAX_POPULATE_SERVERS
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。
4.1.3 インメモリー移入の制御
INMEMORY
句をデータ定義言語(DDL)文で使用して、IM列ストアへの移入の対象となるオブジェクトを指定します。表領域、表、パーティションおよびマテリアライズド・ビューを使用可能にできます。
この項では、次の項目について説明します。
4.1.3.1 INMEMORY副句
INMEMORY
はセグメントレベルの属性で、列レベルの属性ではありません。ただし、INMEMORY
属性を、指定したオブジェクト内の列のサブセットに適用できます。
IM列ストアに対するオブジェクトを有効化または無効化するには、次のいずれかの文でINMEMORY
句を指定します。
-
CREATE TABLESPACE
またはALTER TABLESPACE
デフォルトで、表領域内の表およびマテリアライズド・ビューはすべてIM列ストアに対して有効です。表領域内の個々の表およびマテリアライズド・ビューには、異なる
INMEMORY
属性がある場合があります。個々のデータベース・オブジェクトの属性は、表領域の属性をオーバーライドします。 -
CREATE TABLE
またはALTER TABLE
デフォルトでは、IM列ストアは表内のすべての非仮想列を移入します。表の列のすべてまたはサブセットを指定できます。たとえば、
oe.product_information
のweight_class
列およびcatalog_url
列を適格性から除外する場合があります。パーティション表の場合、IM列ストア内のパーティションのすべて、またはサブセットを移入できます。デフォルトで、パーティション表の場合、すべての表パーティションがINMEMORY
属性を継承します。 -
CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
パーティション・マテリアライズド・ビューの場合、IM列ストア内のパーティションのすべて、またはサブセットを移入できます。
DBA_TABLES
ビューのINMEMORY
列は、どの表にINMEMORY
属性が設定されている(ENABLED
)か、または設定されていない(DISABLED
)かを示します。
次のオブジェクトは、IM列ストアへの移入の対象ではありません。
-
索引
-
索引構成表
-
ハッシュ・クラスタ
-
SYS
ユーザーに所有されているか、SYSTEM
またはSYSAUX
表領域内に格納されているオブジェクト
IM列ストアに対して表を有効化し、それに次のようなタイプの列が含まれる場合、これらの列はIM列ストアに移入されません。
-
表外格納列(VARRAY、ネストした表の列、およびアウトラインLOB)
-
LONG
またはLONG RAW
データ型を使用する列 -
拡張データ型の列
例4-2 表のINMEMORYとしての指定
データベースにユーザーsh
として接続していると仮定します。FOR QUERY LOW
のデフォルト圧縮レベルを使用して、IM列ストアへの移入に対してcustomers
表を有効化します(「インメモリー圧縮」を参照)。
SQL> SELECT TABLE_NAME, INMEMORY FROM USER_TABLES WHERE TABLE_NAME = 'CUSTOMERS';
TABLE_NAME INMEMORY
---------- --------
CUSTOMERS DISABLED
SQL> ALTER TABLE customers INMEMORY;
Table altered.
SQL> SELECT TABLE_NAME, INMEMORY, INMEMORY_COMPRESSION FROM USER_TABLES WHERE TABLE_NAME='CUSTOMERS';
TABLE_NAME INMEMORY INMEMORY_COMPRESS
---------- -------- -----------------
CUSTOMERS ENABLED FOR QUERY LOW
関連項目:
データベースに対するIM列ストアの有効化4.1.3.2 インメモリー移入の優先順位オプション
IM列ストアに対してオブジェクトを有効にする場合、オブジェクトを移入するタイミングをOracle Databaseで制御することも(デフォルト)、移入キューでのオブジェクトの優先度を決定するレベルを指定することもできます。
Oracle SQLには、移入のためにキューをより細かく制御できるようにするINMEMORY PRIORITY
句が組み込まれています。たとえば、あるデータベース・オブジェクトのデータを移入してから他のデータベース・オブジェクトのデータを移入することが、重要になったり重要でなくなったりすることがあります。
ビデオ:
次の表では、サポートされている優先度レベルを説明します。
表4-1 IM列ストアにデータベース・オブジェクトを移入するための優先度レベル
CREATE/ALTERの構文 | 説明 |
---|---|
|
データベースでは、要求された場合のみオブジェクトが移入されます。データベース・オブジェクトの全体スキャンによって、IM列ストアへのオブジェクトの移入がトリガーされます。 これは、 |
|
データベースにより、オブジェクトに低い優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。 オブジェクトは、優先度レベルが |
|
データベースにより、オブジェクトに中間の優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。 データベース・オブジェクトは、優先度レベルが |
|
データベースにより、オブジェクトに高い優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。 データベース・オブジェクトのデータは、優先度レベルが |
|
データベースにより、オブジェクトに低い優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。 データベース・オブジェクトのデータは、優先度レベルが |
複数のデータベース・オブジェクトの優先度レベルがNONE
以外である場合、Oracle Databaseでは、優先度レベルに基づいて移入するオブジェクトのデータをキューに入れます。CRITICAL
優先度レベルのデータベース・オブジェクトが最初に移入され、HIGH
優先度レベルのデータベース・オブジェクトが次に移入される、といったようになります。IM列ストアに領域が残っていない場合、領域が使用できるようになるまで、他のオブジェクトは移入されません。
ノート:
すべてのオブジェクトをCRITICAL
として指定した場合、データベースでは、どのオブジェクトも他より重要とはみなされません。
データベースを再起動すると、優先度レベルがNONE
以外のデータベース・オブジェクトのデータはすべて起動時にIM列ストアに移入されます。優先度レベルがNONE
以外のデータベース・オブジェクトの場合、そのデータベース・オブジェクトが含指定されているALTER
TABLE
またはALTER MATERIALIZED VIEW
DDL文は、IM列ストアでDDLの変更が記録されるまで戻りません。
ノート:
-
優先度レベル設定は、表全体または表パーティションに適用する必要があります。表内の列のサブセットごとに異なるIM列ストア優先度レベルを指定することはできません。
-
ディスク上のセグメントが64KB以下の場合、IM列ストアに移入されません。したがって、IM列ストアに対して有効になっている小規模データベース・オブジェクトは、移入されないことがあります。
関連項目:
-
CREATE TABLE ... INMEMORY PRIORITY
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
4.1.3.3 IM列ストアの圧縮方法
要件に応じて、様々なレベルでインメモリー・オブジェクトを圧縮できます。
一般には、圧縮は領域を節約するメカニズムです。ただし、IM列ストアでは、問合せパフォーマンスも向上させる新しい一連のアルゴリズムを使用して、データを圧縮できます。FOR DML
またはFOR QUERY
オプションを使用して列データが圧縮される場合、SQL問合せは、圧縮されたデータに対して直接実行します。そのため、スキャンおよびフィルタ操作は、非常に少量のデータに対して行います。データベースでは、結果セットに必要な場合のみ、データが解凍されます。
ビデオ:
V$IM_SEGMENTS
およびV$IM_COLUMN_LEVEL
ビューでは、現在の圧縮レベルが示されます。適切なALTER
コマンドを使用することで、圧縮レベルを変更できます。表が現在IM列ストアに移入されており、PRIORITY
以外の表のINMEMORY
属性を変更した場合は、データベースでその表がIM列ストアから除去されます。再移入の動作は、PRIORITY
設定によって異なります。
次の表に、IM列ストアでサポートされているデータ圧縮方法をまとめます。
表4-2 IM列ストアの圧縮方法
CREATE/ALTERの構文 | 説明 |
---|---|
|
データは圧縮されません。 |
|
この方法では、DMLのパフォーマンスが最適になります。 この方法では、 ノート: この圧縮方法は、Exadataフラッシュ・キャッシュの |
|
この方法は、問合せパフォーマンスが最適になります。 IM列ストア・データの圧縮は、 この方法は、 |
|
この方法では、問合せパフォーマンスが向上し、領域が節約されます。 IM列ストアデータの圧縮は、 |
|
この方法では、領域節約になるような方向で、領域節約と問合せパフォーマンスのバランスがとられます。 IM列ストア・データの圧縮は、 この方法は、 |
|
この方法では、最も優れた領域節約がもたらされます。 IM列ストア・データを最も大きく圧縮します。 |
SQL文では、MEMCOMPRESS
キーワードの前にINMEMORY
キーワードがある必要があります。
関連項目:
-
ALTER TABLE ... CELLMEMORY
についてさらに学習するには、『Oracle Exadata Storage Server Softwareユーザーズ・ガイド』を参照 -
CREATE TABLE ... INMEMORY PRIORITY
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
4.1.3.4 Oracle Compression Advisor
Oracle Compression AdvisorではMEMCOMPRESS
句を使用してユーザーが実感できる圧縮率を推定します。アドバイザはDBMS_COMPRESSION
インタフェースを使用します。
表に対してDBMS_COMPRESSION.GET_COMPRESSION_RATIO
を実行すると、Oracle Databaseにより、行のサンプルが分析されます。このため、Oracle Compression Advisorでは、IM列ストアに移入された後に表が得られる圧縮結果について、適切な見積りが提供されます。
関連項目:
DBMS_COMPRESSION.GET_COMPRESSION_RATIO
について学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
4.2 IM列ストアに対する表の有効化および無効化
IM列ストアに対して表を有効にするには、CREATE TABLE
またはALTER TABLE
文でINMEMORY
句を指定します。IM列ストアに対して表を無効にするには、CREATE TABLE
またはALTER TABLE
文でNO INMEMORY
句を指定します。
この項では、次の項目について説明します。
4.2.1 インメモリー列ストアに対する新しい表の有効化
新しい表をIM列ストアに対して有効にするには、CREATE TABLE
文でINMEMORY
句を指定します。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。
新しい表をIM列ストアに対して有効にするには:
-
表の作成に必要な権限があるユーザーとして、データベースにログインします。
-
INMEMORY
句またはNO INMEMORY
句を指定してCREATE TABLE
文を実行します。
関連項目:
-
CREATE TABLE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照
4.2.2 IM列ストアに対する既存の表の有効化および無効化
既存の表をIM列ストアに対して有効または無効にするには、ALTER TABLE
文でINMEMORY
句またはNO INMEMORY
句を指定します。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。
IM列ストアに対して既存の表を有効または無効にするには:
-
ALTER TABLE
権限のあるユーザーとしてデータベースにログインします。 -
INMEMORY
句またはNO INMEMORY
句を指定してALTER TABLE
文を実行します。 -
必要な場合は、インメモリー・セグメントに関するメタデータ(サイズ、優先順位、圧縮レベル)を表示するために、
V$IM_SEGMENTS
を問い合せます。
関連項目:
-
ALTER TABLE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照 -
V$IM_SEGMENTS
ビューの詳細は、『Oracle Databaseリファレンス』を参照
4.2.3 IM列ストアに対する表の有効化および無効化: 例
次の例では、IM列ストアに対して表を有効化または無効化する方法を示します。
例4-3 表の作成とIM列ストアに対する有効化
次の例では、test_inmem
表を作成し、IM列ストアに対して有効にします。
CREATE TABLE test_inmem (
id NUMBER(5) PRIMARY KEY,
test_col VARCHAR2(15))
INMEMORY;
この例では、INMEMORY
句のデフォルトであるMEMCOMPRESS FOR QUERY
およびPRIORITY NONE
を使用します。
例4-4 IM列ストアに対する表の有効化
次のDDL文では、IM列ストアに対してsh.sales
表が有効になります。
ALTER TABLE sh.sales INMEMORY;
上の文では、INMEMORY
句のデフォルトであるMEMCOMPRESS FOR QUERY
およびPRIORITY NONE
が使用されます。
次の問合せでは、sales
の全体スキャンが引き起こされ、それにより、表がIM列ストアに移入されます。
SELECT /*+ FULL(sales) NO_PARALLEL(sales) */ COUNT(*) FROM sh.sales;
次の問合せでは、sales
の移入ステータスが示されます(出力例が含まれています)。
COL OWNER FORMAT a3
COL NAME FORMAT a10
COL STATUS FORMAT a20
SELECT OWNER, SEGMENT_NAME NAME,
POPULATE_STATUS STATUS
FROM V$IM_SEGMENTS;
OWN NAME STATUS
--- ---------- --------------------
SH SALES COMPLETED
次の問合せでは、圧縮率が計算されます。この問合せは、表がディスク上でさらに圧縮されていないことが前提となります。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a5
SET PAGESIZE 50000
SELECT v.OWNER, v.SEGMENT_NAME, v.BYTES ORIG_SIZE,
v.INMEMORY_SIZE IN_MEM_SIZE,
ROUND(v.BYTES / v.INMEMORY_SIZE, 2) COMP_RATIO
FROM V$IM_SEGMENTS v
ORDER BY 4;
OWNER SEGME ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ----- ---------- ----------- ----------
SH SALES 851968 1310720 .65
SH SALES 835584 1310720 .64
SH SALES 925696 1310720 .71
SH SALES 958464 1310720 .73
SH SALES 950272 1310720 .73
SH SALES 786432 1310720 .6
SH SALES 876544 1310720 .67
SH SALES 753664 1310720 .58
SH SALES 1081344 1310720 .83
SH SALES 901120 1310720 .69
SH SALES 925696 1310720 .71
SH SALES 933888 1310720 .71
SH SALES 843776 1310720 .64
SH SALES 999424 1310720 .76
SH SALES 581632 1507328 .39
SH SALES 696320 1507328 .46
16 rows selected.
例4-5 FOR CAPACITY LOW圧縮を指定したIM列ストアに対する表の有効化
次のDDL文では、IM列ストアに対してoe.product_information
表を有効にし、圧縮方法FOR CAPACITY LOW
を指定します。
ALTER TABLE oe.product_information
INMEMORY
MEMCOMPRESS FOR CAPACITY LOW;
上のDDL文では、PRIORITY
句のデフォルトであるNONE
が使用されます。次の問合せでは、oe.product_information
表がスキャンされて移入されます(出力例が含まれています)。
SELECT /*+ FULL(p) NO_PARALLEL(p) */ COUNT(*)
FROM oe.product_information p;
COUNT(*)
----------
288
次の問合せでは、圧縮率が計算されます(出力例が含まれています)。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000
SELECT v.OWNER, v.SEGMENT_NAME, v.BYTES ORIG_SIZE,
v.INMEMORY_SIZE IN_MEM_SIZE,
ROUND(v.BYTES / v.INMEMORY_SIZE, 2) COMP_RATIO
FROM V$IM_SEGMENTS v
WHERE SEGMENT_NAME LIKE 'P%'
ORDER BY 4;
OWNER SEGMENT_NAME ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ------------------- ---------- ----------- ----------
OE PRODUCT_INFORMATION 98304 1310720 .08
例4-6 HIGHデータ移入優先度を指定したIM列ストアに対する表の有効化
次のDDL文では、IM列ストアに対してoe.product_information
表を有効にし、表データをIM列ストアに移入するためにPRIORITY HIGH
を指定します。
ALTER TABLE
oe.product_information
INMEMORY
PRIORITY HIGH;
例4-7 FOR CAPACITY HIGH圧縮およびLOWデータ移入優先度を指定したIM列ストアに対する表の有効化
次の問合せでは、oe.product_information
表の優先順位および圧縮設定が示されます。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000
SELECT v.OWNER, v.SEGMENT_NAME, v.INMEMORY_PRIORITY,
v.INMEMORY_COMPRESSION
FROM V$IM_SEGMENTS v
WHERE SEGMENT_NAME LIKE 'P%';
OWNER SEGMENT_NAME INMEMORY INMEMORY_COMPRESS
----- ------------------- -------- -----------------
OE PRODUCT_INFORMATION HIGH FOR CAPACITY LOW
次のDDL文では、oe.product_information
が、FOR CAPACITY HIGH
表圧縮およびPRIORITY LOW
を使用するよう変更されます。
ALTER TABLE oe.product_information
INMEMORY
MEMCOMPRESS FOR CAPACITY HIGH
PRIORITY LOW;
例4-8 IM列ストアに対するパーティション表の有効化
この次のDDL文では、range_sales
というパーティション表が作成され、IM列ストア内の最初の3つのパーティションに対して異なる圧縮レベルが指定されます。最後の2つのパーティションは、IM列ストアに移入されません。
CREATE TABLE range_sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
(PARTITION SALES_Q4_1999
VALUES LESS THAN (TO_DATE('01-JAN-2015','DD-MON-YYYY'))
INMEMORY MEMCOMPRESS FOR DML,
PARTITION SALES_Q1_2000
VALUES LESS THAN (TO_DATE('01-APR-2015','DD-MON-YYYY'))
INMEMORY MEMCOMPRESS FOR QUERY,
PARTITION SALES_Q2_2000
VALUES LESS THAN (TO_DATE('01-JUL-2015','DD-MON-YYYY'))
INMEMORY MEMCOMPRESS FOR CAPACITY,
PARTITION SALES_Q3_2000
VALUES LESS THAN (TO_DATE('01-OCT-2015','DD-MON-YYYY'))
NO INMEMORY,
PARTITION SALES_Q4_2000
VALUES LESS THAN (MAXVALUE));
例4-9 IM列ストアに対する表の無効化
IM列ストアに対して表を無効にするには、NO INMEMORY
句を指定します。次の例では、IM列ストアに対してoe.product_information
表を無効にします。
ALTER TABLE oe.product_information NO INMEMORY;
V$IM_SEGMENTS
ビューを問い合せると、IM列ストアに移入されているデータベース・オブジェクトをリストできます。
4.3 インメモリー表に対する列の有効化および無効化
INMEMORY
句を個々の列に対して指定できます。非仮想列およびインメモリー仮想列(IM仮想列)はどちらも、IM列ストアへの移入の対象となります。
この項では、次の項目について説明します。
4.3.1 IM仮想列について
IM仮想列は、式を評価することによってその値が導出されること以外は、他の任意の列と同じです。
事前に計算されたIM仮想列の値をIM列ストアに格納すると、問合せのパフォーマンスが向上する可能性があります。式には、同じ表からの列、制約、SQL関数およびユーザー定義PL/SQL関数(DETERMINISTIC
のみ)を含めることができます。IM仮想列に明示的に書き込むことはできません。
ノート:
仮想列またはIM式は、移入されたオブジェクトごとの列の上限である1000個に数えられます。
IM列ストアにIM仮想列を移入するには、INMEMORY_VIRTUAL_COLUMNS
初期化パラメータを次のいずれかの値に設定します。
-
MANUAL
(デフォルト): 表がIM列ストアに対して有効になっている場合、この表で定義されているIM仮想列は、明示的にINMEMORY
として設定されていないかぎり、移入の対象ではありません。 -
ENABLE
: 表がIM列ストアに対して有効になっている場合、この表で定義されているすべてのIM仮想列は、明示的にNO INMEMORY
として設定されていないかぎり、移入の対象となります。デフォルトでは、IM列ストア内の列の圧縮レベルは、それが格納されている表またはパーティションと同じです。ただし、IM仮想列に対して異なる圧縮レベルが指定されている場合、それは指定された圧縮レベルで移入されます。
IM列ストアにIM仮想列が移入されないよう指定するには、この初期化パラメータをDISABLE
に設定します。
IM仮想列およびIM式の基礎となる記憶域構造は同じです。ただし、IM式およびIM仮想列は異なるメカニズムで制御されます。
ノート:
-
IM列ストアでは、
INMEMORY
とマークされている表の仮想列のみが移入されます。 -
IM列ストアにIM仮想列を移入するには、
COMPATIBLE
初期化パラメータの値が12.1.0以上に設定されている必要があります。
関連項目:
-
INMEMORY
句の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
4.3.2 IM仮想列の有効化
IM仮想列により、計算の繰返しをなくすことで、問合せのパフォーマンスが向上します。また、データベースはSIMDベクター処理などの手法を使用してIM仮想列をスキャンおよびフィルタリングできます。
前提条件
IM仮想列を有効にするには、次の条件を満たしている必要があります。
-
IM列ストアがデータベースに対して有効になっている。
「データベースに対するIM列ストアの有効化」を参照してください。
-
仮想列を含む表は内部であり、
INMEMORY
属性が指定されていること。「IM列ストアに対する表の有効化および無効化」を参照してください。
-
INMEMORY_VIRTUAL_COLUMNS
初期化パラメータがDISABLE
に設定されていない。 -
初期化パラメータ
COMPATIBLE
の値が12.1.0
以上に設定されている。
IM仮想列を有効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY_VIRTUAL_COLUMNS
初期化パラメータをENABLE
に設定するか、特定の仮想列をIM列ストアに対して有効にします。
例4-10 IM列ストアに対する仮想列の有効化
この例では、SYSTEM
としてデータベースにログインしています。IM列ストアは有効化されていますが、仮想列の移入は現在無効化されています。
SQL> SHOW PARAMETER INMEMORY_SIZE
NAME TYPE VALUE
------------------------------------ ----------- -----
inmemory_size big integer 200M
SQL> SHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS
NAME TYPE VALUE
------------------------------------ ----------- -------
inmemory_virtual_columns string DISABLE
仮想列をhr.employees
表に追加してから、その表がINMEMORY
であると指定します。
SQL> ALTER TABLE hr.employees ADD (weekly_sal AS (ROUND(salary*12/52,2)));
Table altered.
SQL> ALTER TABLE hr.employees INMEMORY;
Table altered.
この段階では、weekly_sal
は移入の対象ではありませんが、hr.employees
内の非仮想列は移入の対象となっています。次の文により、weekly_sal
、およびhr.employees
内の他の仮想列が移入されるようになります。
SQL> ALTER SYSTEM SET INMEMORY_VIRTUAL_COLUMNS=ENABLE SCOPE=BOTH;
System altered.
SCOPE=SPFILE
を使用することもできますが、その場合、変更は次にデータベースを再起動するまで有効になりません。SCOPE=BOTH
を使用すると、変更はただちに行われ、再起動は必要ありません。
例4-11 IM列ストアに対する特定のIM仮想列の有効化
この例では、INMEMORY_VIRTUAL_COLUMNS
初期化パラメータがMANUAL
に設定され、IM列ストアにIM仮想列を明示的に追加する必要があることを前提としています。この例では、最初にhr.admin_emp
表を作成します。
CREATE TABLE hr.admin_emp (
empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
job VARCHAR2(10),
sal NUMBER(7,2),
hrly_rate NUMBER(7,2) GENERATED ALWAYS AS (sal/2080),
deptno NUMBER(3) NOT NULL)
INMEMORY;
この段階では、hrly_rate
仮想列は、移入の対象ではありません。次の文では、その仮想列がINMEMORY
として明示的に指定されます。
ALTER TABLE hr.admin_emp INMEMORY(hrly_rate);
4.3.3 IM列ストアに対する列のサブセットの有効化: 例
この例では、IM列ストアに対してoe.product_information
表のすべての列を有効にしますが、weight_class
およびcatalog_url
は例外です。
また、次の文は、IM列ストアに対して有効な列に、別のIM列ストア圧縮方法を指定します。
ALTER TABLE oe.product_information
INMEMORY MEMCOMPRESS FOR QUERY (
product_id, product_name, category_id, supplier_id, min_price)
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (
product_description, warranty_period, product_status, list_price)
NO INMEMORY (
weight_class, catalog_url);
具体的には、前述の文は次のように指定します。
-
product_id
、product_name
、category_id
supplier_id
およびmin_price
の各列は、MEMCOMPRESS FOR QUERY
圧縮方法を使用してIM列ストアに対して有効になります。 -
product_description
、warranty_period
、product_status
およびlist_price
の各列は、MEMCOMPRESS FOR CAPACITY HIGH
圧縮方法を使用してIM列ストアに対して有効になります -
weight_class
列およびcatalog_url
列は、IM列ストアに対して有効になりません。 -
表では、
PRIORITY
句のデフォルトであるPRIORITY NONE
が使用されます。
ノート:
優先度レベル設定は、表全体またはパーティションに適用する必要があります。表の列のサブセットごとに異なるIM列ストアの優先度レベルを指定することはできません。
データベース・オブジェクトに対して定義されている、選択された列圧縮レベルを判断するには、次の例で示すようにV$IM_COLUMN_LEVEL
ビューを問い合せます。
COL TABLE_NAME FORMAT a20
COL COLUMN_NAME FORMAT a20
SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
FROM V$IM_COLUMN_LEVEL
WHERE TABLE_NAME = 'PRODUCT_INFORMATION'
ORDER BY COLUMN_NAME;
TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION
-------------------- -------------------- --------------------------
PRODUCT_INFORMATION CATALOG_URL NO INMEMORY
PRODUCT_INFORMATION CATEGORY_ID FOR QUERY LOW
PRODUCT_INFORMATION LIST_PRICE FOR CAPACITY HIGH
PRODUCT_INFORMATION MIN_PRICE FOR QUERY LOW
PRODUCT_INFORMATION PRODUCT_DESCRIPTION FOR CAPACITY HIGH
PRODUCT_INFORMATION PRODUCT_ID FOR QUERY LOW
PRODUCT_INFORMATION PRODUCT_NAME FOR QUERY LOW
PRODUCT_INFORMATION PRODUCT_STATUS FOR CAPACITY HIGH
PRODUCT_INFORMATION SUPPLIER_ID FOR QUERY LOW
PRODUCT_INFORMATION WARRANTY_PERIOD FOR CAPACITY HIGH
PRODUCT_INFORMATION WEIGHT_CLASS NO INMEMORY
関連項目:
-
「インメモリー圧縮」
-
V$IM_COLUMN_LEVEL
ビューの詳細は、『Oracle Databaseリファレンス』を参照
4.3.4 NO INMEMORY表でのINMEMORY列属性の指定: 例
Oracle Database 12cリリース2 (12.2)以降では、まだINMEMORY
として指定されていないオブジェクト上で、列レベルでINMEMORY
句を指定できます。
以前のリリースでは、列レベルのINMEMORY
句は、INMEMORY
表またはパーティションで指定されている場合のみ有効でした。この制限は、表またはパーティションにINMEMORY
句を関連付ける前に、列にINMEMORY
句を関連付けることはできないことを意味します。
Oracle Database 12cリリース2 (12.2)以降では、INMEMORY
句を列レベルで指定した場合、データベースで、指定された列の属性が記録されます。表がNO INMEMORY
(デフォルト)の場合、表またはパーティションがINMEMORY
として指定されるまで、列レベルの属性は、表を問い合せる方法には影響しません。表自体をNO INMEMORY
としてマークした場合は、データベースにより、既存の列レベル属性が削除されます。
この例での目的は、パーティション表内の列c3
がIM列ストアに移入されないようにすることです。次のステップを実行します。
-
次のように、パーティション表
t
を作成します。CREATE TABLE t (c1 NUMBER, c2 NUMBER, c3 NUMBER) NO INMEMORY -- this clause specifies the table itself as NO INMEMORY PARTITION BY LIST (c1) ( PARTITION p1 VALUES (0), PARTITION p2 VALUES (1), PARTITION p3 VALUES (2) );
表
t
はNO INMEMORY
です。この表は、列c1
上のリストによってパーティション化されており、p1
、p2
およびp3
という3つのパーティションを含んでいます。 -
表内の列の圧縮を問い合せます(出力例が含まれています)。
COL TABLE_NAME FORMAT a20 COL COLUMN_NAME FORMAT a20 SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION FROM V$IM_COLUMN_LEVEL WHERE TABLE_NAME = 'T' ORDER BY COLUMN_NAME; no rows selected
出力で示されているように、列レベルの
INMEMORY
属性は設定されていません。 -
列
c3
が移入されないようにするには、NO INMEMORY
属性を列c3
に適用します。ALTER TABLE t NO INMEMORY (c3);
-
表内の列の圧縮を問い合せます(出力例が含まれています)。
SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION FROM V$IM_COLUMN_LEVEL WHERE TABLE_NAME = 'T' ORDER BY COLUMN_NAME; TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION -------------------- -------------------- -------------------- T C1 DEFAULT T C2 DEFAULT T C3 NO INMEMORY
データベースでは、
c3
のNO INMEMORY
属性が記録されています。他の列では、デフォルトの圧縮が使用されます。 -
パーティション
p3
をINMEMORY
として指定します。ALTER TABLE t MODIFY PARTITION p3 INMEMORY PRIORITY CRITICAL;
列
c3
は前にNO INMEMORY
として指定されているため、パーティションp3
の最初の移入には、列c3
は含まれません。 -
表全体を
INMEMORY
として指定します。ALTER TABLE t INMEMORY;
-
表内の列の圧縮を問い合せます(出力例が含まれています)。
SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION FROM V$IM_COLUMN_LEVEL WHERE TABLE_NAME = 'T' ORDER BY COLUMN_NAME; TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION -------------------- -------------------- -------------------------- T C1 DEFAULT T C2 DEFAULT T C3 NO INMEMORY
データベースでは、列
c3
のNO INMEMORY
設定が保持されています。他の列では、デフォルトの圧縮が使用されます。 - 異なる圧縮レベルを列
c1
およびc2
に適用します。ALTER TABLE t INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (c1) INMEMORY MEMCOMPRESS FOR CAPACITY LOW (c2);
-
表内の列の圧縮を問い合せます(出力例が含まれています)。
SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION FROM V$IM_COLUMN_LEVEL WHERE TABLE_NAME = 'T' ORDER BY COLUMN_NAME; TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION -------------------- -------------------- -------------------------- T C1 FOR CAPACITY HIGH T C2 FOR CAPACITY LOW T C3 NO INMEMORY
これで、各列に異なる圧縮レベルが設定されました。
-
表全体を
NO INMEMORY
として指定します。ALTER TABLE t NO INMEMORY;
-
表内の列の圧縮を問い合せます(出力例が含まれています)。
SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION FROM V$IM_COLUMN_LEVEL WHERE TABLE_NAME = 'T' ORDER BY COLUMN_NAME; no rows selected
表全体が
NO INMEMORY
として指定されたため、データベースにより、列レベルのすべてのINMEMORY
属性が削除されました。
関連項目:
ALTER TABLE
の構文およびセマンティクスは、『Oracle Database SQL言語リファレンス』を参照してください。
4.4 IM列ストアに対する表領域の有効化および無効化
IM列ストアに対する表領域を有効化または無効化できます。
INMEMORY
句を指定したCREATE TABLESPACE
文を使用して表領域を作成する際に、IM列ストアに対して表領域を有効にします。また、INMEMORY
句を指定したALTER TABLESPACE
文を使用して、IM列ストアに対して有効になるように表領域を変更できます。
IM列ストアに対して表領域を無効にするには、CREATE TABLESPACE
文またはALTER TABLESPACE
文にNO INMEMORY
句を指定します。
IM列ストアに対して表領域が有効になっている場合、表領域内の表およびマテリアライズド・ビューはすべて、デフォルトでIM列ストアに対して有効になります。INMEMORY
句は、表、マテリアライズド・ビューおよび表領域の場合と同じです。DEFAULT
記憶域句は、IM列ストアに対して表領域を有効にする場合はINMEMORY
句の前に、IM列ストアに対して表領域を無効にする場合はNO INMEMORY
句の前に必要です。
IM列ストアに対して表領域が有効になっている場合、表領域内の個々の表およびマテリアライズド・ビューに異なるインメモリー設定を指定でき、個々のデータベース・オブジェクトの設定は表領域の設定を上書きします。たとえば、メモリーにデータを移入するために表領域がPRIORITY LOW
に設定されているのに対し、表領域内の表がPRIORITY HIGH
に設定されている場合、その表ではPRIORITY HIGH
を使用します。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。
IM列ストアに対する表領域を有効化または無効化にします。
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY
句またはNO INMEMORY
句を指定して、CREATE TABLESPACE
またはALTER TABLESPACE
文を実行します。
例4-12 表領域の作成とIM列ストアに対する有効化
次の例では、users01
表領域を作成し、IM列ストアに対して有効にします。
CREATE TABLESPACE users01
DATAFILE 'users01.dbf' SIZE 40M
ONLINE
DEFAULT INMEMORY;
この例では、INMEMORY
句にデフォルトを使用しています。したがって、MEMCOMPRESS FOR QUERY
およびPRIORITY NONE
が使用されます。
例4-13 表領域の変更とIM列ストアに対する有効化
次の例では、IM列ストアに対して有効になるようにusers01
表領域を変更し、表領域内のデータベース・オブジェクトに対してFOR CAPACITY HIGH
圧縮を指定し、メモリーにデータを移入するためにPRIORITY LOW
を指定します。
ALTER TABLESPACE users01 DEFAULT INMEMORY
MEMCOMPRESS FOR CAPACITY HIGH
PRIORITY LOW;
4.5 IM列ストアに対するマテリアライズド・ビューの有効化および無効化
IM列ストアに対してマテリアライズド・ビューを有効および無効にすることができます。
IM列ストアに対してマテリアライズド・ビューを有効にするには、CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
文でINMEMORY
句を使用します。IM列ストアに対してマテリアライズド・ビューを無効にするには、CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
文でNO INMEMORY
句を使用します。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。
IM列ストアに対してマテリアライズド・ビューを有効または無効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY
句またはNO INMEMORY
句を指定して、CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
文を実行します。
例4-14 マテリアライズド・ビューの作成とIM列ストアに対する有効化
次の文では、oe.prod_info_mv
マテリアライズド・ビューを作成し、IM列ストアに対して有効にします。
CREATE MATERIALIZED VIEW oe.prod_info_mv INMEMORY
AS SELECT * FROM oe.product_information;
この例では、INMEMORY
句のデフォルトであるMEMCOMPRESS FOR QUERY LOW
およびPRIORITY
NONE
を使用します。
例4-15 HIGHデータ移入優先度を指定したIM列ストアに対するマテリアライズド・ビューの有効化
次の文では、IM列ストアに対してoe.prod_info_mv
マテリアライズド・ビューを有効にします。
ALTER MATERIALIZED VIEW oe.prod_info_mv INMEMORY PRIORITY HIGH;
この例では、デフォルトの圧縮であるMEMCOMPRESS FOR QUERY LOW
を使用します。
関連項目:
CREATE
またはALTER MATERIALIZED VIEW
文についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。
4.6 インメモリー・オブジェクトの初期移入の強制: チュートリアル
インメモリー移入に対してオブジェクトを有効にしても、オブジェクトはすぐには移入されません。
PRIORITY
をNONE
に設定してオブジェクトを有効にし、それをすぐに移入する必要がある場合には、次の選択肢があります。
-
表の全体スキャンを強制的に実行する
-
DBMS_INMEMORY.POPULATE
プロシージャを使用する
前提
このチュートリアルでは、次のことが前提となっています。
-
IM列ストアが有効になっている。
-
PRIORITY
のデフォルトであるNONE
を使用して、sh.customers
表をインメモリー移入に対して有効にする必要がある。 -
IM列ストアへの
sh.customers
の即時移入を強制的に実行する必要がある。
INMEMORY表の移入を強制的に実行するには:
-
SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY
属性を表に適用します。たとえば、次のように
sh.customers
をIM移入のために有効にします。ALTER TABLE sh.customers INMEMORY;
-
必要な場合は、移入ステータスを確認するために、
V$IM_SEGMENTS
を問い合せます。たとえば、次の文を使用します(出力例が含まれています)。
COL OWNER FORMAT a10; COL NAME FORMAT a25; COL STATUS FORMAT a10; SELECT OWNER, SEGMENT_NAME NAME, POPULATE_STATUS STATUS FROM V$IM_SEGMENTS WHERE SEGMENT_NAME = 'CUSTOMERS'; no rows selected
上の出力では、オブジェクトがまだIM列ストアに移入されていないことが示されています。
-
表に対して
DBMS_INMEMORY.POPULATE
プロシージャを実行します。たとえば、次のようにこのプロシージャを
sh.customers
に対して有効にします。EXEC DBMS_INMEMORY.POPULATE('SH', 'CUSTOMERS');
-
必要な場合は、移入ステータスを確認するために、
V$IM_SEGMENTS
を問い合せます。たとえば、次の文を使用します(出力例が含まれています)。
SELECT OWNER, SEGMENT_NAME NAME, POPULATE_STATUS STATUS FROM V$IM_SEGMENTS WHERE SEGMENT_NAME = 'CUSTOMERS'; OWN NAME STATUS --- ---------- -------------------- SH CUSTOMERS COMPLETED
これで、オブジェクトがIM列ストアに移入されました。
関連項目:
-
V$IM_SEGMENTS
について学習するには、『Oracle Databaseリファレンス』を参照 -
DBMS_INMEMORY.POPULATE
について学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照
4.7 IM列ストアに対するADOの有効化
情報ライフサイクル管理(ILM)は、作成からアーカイブまたは削除までデータを管理するための一連のプロセスおよびポリシーです。
自動データ最適化(ADO)では、ILM計画を実装するために、ポリシーが作成され、それらのポリシーに基づいてアクションが自動化されます。ADOでは、データ・アクセス・パターンを追跡する、ヒート・マップが使用されます。
ノート:
この章は、ILM、ADOおよびヒート・マップの基本概念をよく理解していることが前提となっています。より詳細な背景については、Oracle Database VLDBおよびパーティショニング・ガイドを参照してください。
この項では、次の項目について説明します。
4.7.1 ADOポリシーとIM列ストアについて
ADOでは、IM列ストアの管理にADOポリシーを使用します。セグメント・レベルでINMEMORY
句を使用することによってのみ、ADOポリシーを作成できます。
データベースでは、ADOポリシーは、オブジェクトの属性のように扱われます。ADOポリシーは、インスタンス・レベルではなくデータベース・レベルとなります。Oracle Databaseでは、Database In-Memoryのために次のタイプのADOポリシーがサポートされています。
-
INMEMORY
ポリシーこのポリシーは、オブジェクトを
INMEMORY
属性でマークし、それらをIM列ストアへの移入のために有効にします。 -
再圧縮ポリシー
このポリシーは、
INMEMORY
オブジェクトに対する圧縮レベルを変更します。 -
NO INMEMORY
ポリシーこのポリシーは、オブジェクトをIM列ストアから削除し、その
INMEMORY
属性を削除します。
Oracle Databaseでは、次の条件をサポートして、ポリシーを適用する時期を決定します。
-
オブジェクトが変更されてからの指定日数
DBA_HEAT_MAP_SEGMENT
ビュー内の列SEGMENT_WRITE_TIME
からこの値を取得します。 -
オブジェクトがアクセスされてからの指定日数
この値は、
DBA_HEAT_MAP_SEGMENT
ビューの列SEGMENT_WRITE_TIME
、FULL_SCAN
およびLOOKUP_SCAN
内の大きいほうの値となります。 -
オブジェクトが作成されてからの指定日数
DBA_OBJECTS
内のCREATED
列からこの値を取得します。 -
ブール値を返すユーザー定義関数
関連項目:
-
DBA_HEAT_MAP_SEGMENT
ビューについて学習するには、『Oracle Databaseリファレンス』を参照 -
INMEMORY
句について学習するには、『Oracle Database SQL言語リファレンス』を参照
4.7.2 ADOとIM列ストアの目的
ADOでは、IM列ストアが新しいデータ層として管理されます。
ポリシーを作成して、IM列ストアからオブジェクトがあまり頻繁にアクセスされない場合にはそのオブジェクトを除去し、オブジェクトが頻繁にアクセスされる場合にはそのオブジェクトを移入することで、問合せのパフォーマンスを向上することができます。ADOでは、ヒート・マップ統計を使用してIM列ストアが管理されます。
INMEMORYポリシーの目的
多くのデータベースでは、セグメントは、作成後に大幅に変更されます。パフォーマンスを最大限に高めるには、ADOで、書込みアクティビティがおさまったときに、これらのセグメントをIM列ストアに移入します。たとえば、パーティションを表に毎日追加する場合は、作成翌日にsales_2016_d100
パーティションを移入するポリシーを作成できます。
ALTER TABLE sales MODIFY PARTITION sales_2016_d100
ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY
PRIORITY HIGH
AFTER 1 DAYS OF CREATION
同様に、作成の2か月後に表に対する書込みアクティビティがおさまることが判明しており、この時間条件が満たされたときにこのオブジェクトを移入する必要があるとします。
ALTER TABLE 2016_ski_sales
ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY
PRIORITY CRITICAL
AFTER 60 DAYS OF CREATION
前述のポリシーでは、2016_ski_sales
表のすべての既存および新規パーティションにポリシーを継承させます。セグメントがポリシーの対象となると、データベースにより、すべてのパーティションが、指定されたINMEMORY
句で個別にマークされます。セグメントにすでにINMEMORY
ポリシーがある場合、データベースでは新しいポリシーは無視されます。
再圧縮ポリシーの目的
アクセス・パターンに基づいてIM列ストア内のデータを圧縮する必要がある場合があります。たとえば、セグメントに対するDMLアクティビティが終了した2日後に、セグメントをDML圧縮から問合せ圧縮に変更する必要があるとします。
ALTER TABLE lineorders
ILM ADD POLICY MODIFY INMEMORY MEMCOMPRESS FOR QUERY HIGH
AFTER 2 DAYS OF NO MODIFICATION
オブジェクトがIM列ストアに移入されていない場合、このポリシーでは、圧縮属性のみが変更されます。オブジェクトがIM列ストアに移入されている場合は、ADOにより、新しい圧縮レベルを使用してオブジェクトが再移入されます。セグメントにまだINMEMORY
属性がない場合、データベースでは、ポリシーは無視されます。
NO INMEMORYポリシーの目的
IM列ストア内の領域を最適化するために、NO INMEMORY
ポリシーを使用して非アクティブなセグメントを除去できます。このポリシーは、不定期の問合せによる非アクティブなセグメントの移入を防止するためにも役立ちます。たとえば、特定のsalesパーティションに関するレポートが年内に頻繁に実行されるが、通常は毎週ではない場合に、このパーティションを、アクセスがなくなってから1週間後に除去する必要があるとします。
ALTER TABLE sales MODIFY PARTITION sales_2015_q1
ILM ADD POLICY NO INMEMORY AFTER 7 DAYS OF NO ACCESS;
1998年用のsales表に問い合せることがほとんどない場合に、アクセスがなくなった翌日に除去する必要があるとします。
ALTER TABLE sales_1998
ILM ADD POLICY NO INMEMORY AFTER 1 DAYS OF NO ACCESS;
除去されたセグメントの問合せがブロックされることはありません。データベースでは、常に、従来のバッファ・キャッシュ・メカニズムを使用してデータにアクセスできます。
4.7.3 ADOはどのように列データと連携するか
ADOの視点からは、IM列ストアは別の記憶域層となります。
この項では、次の項目について説明します。
4.7.3.1 ヒート・マップはどのように機能するか
有効になっている場合は、ヒート・マップにより、自動的にデータ・アクセス・パターンが検出されます。ADOでは、ヒート・マップ・データを使用して、ユーザーが定義したポリシーがデータベース・レベルで実装されます。
ヒート・マップでは、自動的に、行レベルおよびセグメント・レベルで使用情報が追跡されます。行レベルでは、ヒート・マップにより、データ変更回数が追跡されてから、これらの回数がブロック・レベルに集計されます。セグメント・レベルでは、ヒート・マップにより、変更、表の全体スキャンおよび索引参照の回数が追跡されます。
IM列ストアが有効になっている場合は、ヒート・マップにより、列データに対するアクセス・パターンが追跡されます。たとえば、sales
表がホットであるのに対し、locations
表がコールドだとします。ADOアルゴリズムは、行ベースのデータに対してと同じ方法で列データに対して機能します。
データベースでは、定期的にヒート・マップ・データがデータ・ディクショナリに書き込まれます。データベースにより、ヒート・マップ・データがデータ・ディクショナリ・ビューで公開されます。たとえば、インメモリー・オブジェクトに対する読取り回数と書込み回数を取得するには、ALL_HEAT_MAP_SEGMENT
ビューを問い合せます。
関連項目:
-
ヒート・マップについてさらに学習するには、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照
-
ALL_HEAT_MAP_SEGMENT
ビューについて学習するには、『Oracle Databaseリファレンス』を参照
4.7.3.2 ポリシー評価はどのように機能するか
IM列ストア・ポリシーのポリシー評価では、他のADOポリシーの評価と同じインフラストラクチャが使用されます。データベースでは、メンテナンス・ウィンドウの間に自動的にポリシーが評価および実行されます。
データベースでは、データ・ディクショナリに格納されているヒート・マップ統計を使用してポリシーが評価されます。INMEMORY
属性の設定は、大部分はメタデータ操作となります。そのため、パフォーマンスへの影響は最小限となります。
ADOでは、ジョブ・スケジューラを使用して移入が実行されます。インメモリー・コーディネータ・プロセス(IMCO)により、移入が実行されます。
関連トピック
4.7.4 ADOとIM列ストアの制御
HEAT_MAP
初期化パラメータを使用してヒート・マップを有効にします。SQLおよびPL/SQLインタフェースを使用してADOを制御します。
DDL文のILM句
インメモリー・ポリシーの作成には新しいSQL文は必要ありませんが、ILM句には新しいオプションがあります。次の表では、ADOとIM列ストアのためのSQLオプションを説明します。
表4-3 ADOとIM列ストアのためのILM句
句 | 説明 | 例 |
---|---|---|
SET INMEMORY |
オブジェクトに対してINMEMORY 属性を設定します。
|
|
MODIFY INMEMORY |
オブジェクトに対する圧縮レベルを変更します。 |
|
NO INMEMORY |
オブジェクトに対してNO INMEMORY 属性を設定します。
|
|
初期化パラメータ
次の表では、ADOとIM列ストアに関連する初期化パラメータを説明します。
表4-4 ADOとIM列ストアのための初期化パラメータ
初期化パラメータ | 説明 |
---|---|
COMPATIBLE |
互換性を維持する必要があるデータベースのリリースを指定します。ADOでIM列ストアを管理する場合は、このパラメータを12.2.0 以上に設定します。
|
HEAT_MAP |
ヒート・マップ機能とADO機能を両方とも有効にします。ADOでIM列ストアを管理する場合は、このパラメータをON に設定します。
|
INMEMORY_SIZE |
IM列ストアを有効にします。このパラメータは、ゼロ以外の値に設定する必要があります。 |
PL/SQLパッケージ
次の表では、ADOとIM列ストアに関連するPL/SQLパッケージを説明します。
表4-5 ADOとIM列ストアのためのPL/SQLパッケージ
パッケージ | 説明 |
---|---|
DBMS_HEATMAP |
表領域、セグメント、オブジェクト、エクステントおよびブロック・レベルでの詳細なヒート・マップ・データを表示します。 |
DBMS_ILM |
ADOポリシーを使用してILM計画を実装します。 |
DBMS_ILM_ADMIN |
ADOポリシーの実行をカスタマイズします。 |
V$およびデータ・ディクショナリ・ビュー
次の表では、ADOとIM列ストアに関連するビューを説明します。
表4-6 ADOとIM列ストアのためのビュー
ビュー | 説明 |
---|---|
DBA_HEAT_MAP_SEG_HISTOGRAM |
ユーザーが参照できるすべてのセグメントのセグメント・アクセス情報を表示します。 |
DBA_HEAT_MAP_SEGMENT |
ユーザーが参照できるすべてのセグメントの最新のセグメント・アクセス時刻を表示します。 |
DBA_HEATMAP_TOP_OBJECTS |
デフォルトでは、オブジェクトの上位10000個についてヒート・マップ情報を示します。 |
DBA_HEATMAP_TOP_TABLESPACES |
上位10000個の表領域についてヒート・マップ情報を示します。 |
DBA_ILMDATAMOVEMENTPOLICIES |
データベース内のADOポリシーのデータ移動関連属性固有の情報を表示します。action_type 列では、IM列ストアに関連するポリシーを説明します。使用可能な値は、COMPRESSION 、STORAGE 、EVICT およびANNOTATE です。
|
V$HEAT_MAP_SEGMENT |
リアルタイムのセグメント・アクセス情報を表示します。 |
関連項目:
初期化パラメータ、パッケージおよびビューについてさらに学習するには、『Oracle Databaseリファレンス』を参照
4.7.5 IM列ストアのためのADOポリシーの作成
ADOポリシーを使用することで、ヒート・マップ統計に基づいた、オブジェクトに対するINMEMORY
句の設定、変更または削除が可能です。
ALTER TABLE
文でILM ADD POLICY
句を指定し、その後に、次のいずれかの副句を指定します。
-
SET INMEMORY ... SEGMENT
このオプションは、DMLアクティビティがおさまっているときのみセグメントを
INMEMORY
属性でマークする必要がある場合に役立ちます。 -
MODIFY INMEMORY ... MEMCOMPRESS ... SEGMENT
圧縮されていないデータまたは
MEMCOMPRESS FOR DML
レベルでのデータの格納は、それが頻繁に変更されるときに適しています。別の圧縮レベルは、問合せに適しています。セグメントに対するアクティビティの大部分が書込みから読取りに推移した場合は、MODIFY
句を使用して異なる圧縮方法を適用できます。 -
NO INMEMORY ... SEGMENT
このオプションは、セグメントへのアクセスが時間とともに減少する(コールドになる)場合や、ランダム・アクセスの結果としてこのセグメントの移入を防ぐために役立ちます。
前提条件
ADO IM列ストア・ポリシーを使用する前に、次の前提条件を満たしている必要があります。
-
INMEMORY_SIZE
初期化パラメータにゼロ以外の値を設定し、データベースを再起動することにより、データベースのIM列ストアを有効化します。 -
HEAT_MAP
初期化パラメータをON
に設定する必要があります。ヒート・マップは、セグメント・レベルのデータ・アクセス・トラッキングおよびセグメントおよび行レベルのデータ変更トラッキングを提供します。
-
COMPATIBLE
初期化パラメータは12.2.0
以上に設定されている必要があります。
ADOポリシーを作成するには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
ALTER TABLE
文をILM ADD POLICY ... INMEMORY
句とともに使用します。
例4-16 除去ポリシーの作成
この例では、3日間アクセスされなかったoe.order_items
表がIM列ストアから除去されるよう指定するポリシーを作成します。ADO IM列ストア・ポリシーは、セグメント・レベルのポリシーである必要があります。
ALTER TABLE oe.order_items ILM ADD POLICY
NO INMEMORY SEGMENT
AFTER 3 DAYS OF NO ACCESS;
例4-17 DBMS_ILMの使用によるILMポリシーの実行
ポリシーを手動で評価および実行することもできます。したがって、オブジェクトを圧縮および階層化する必要がある時期をプログラムで決定できます。次の例では、sh.sales
のためのADOタスクを手動で実行します。
DECLARE
v_executonid NUMBER;
BEGIN
DBMS_ILM.EXECUTE_ILM ( owner => 'SH',
object_name => 'SALES',
execution_mode => DBMS_ILM.ILM_EXECUTION_OFFLINE,
task_id => v_executionid);
END;
/
関連項目:
-
CREATE TABLE
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照 -
DBMS_ILM
パッケージについてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照