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列ストアに対するオブジェクトを有効化または無効化するには、表領域、表およびマテリアライズド・ビューのDDL文にINMEMORY
句を指定します。DBA_TABLES
ビューのINMEMORY
列は、どの表にINMEMORY
属性が設定されている(ENABLED
)か、または設定されていない(DISABLED
)かを示します。
次のオブジェクトは、IM列ストアへの移入の対象ではありません。
-
索引
-
索引構成表
-
ハッシュ・クラスタ
-
SYS
ユーザーに所有されているか、SYSTEM
またはSYSAUX
表領域内に格納されているオブジェクト
この項では、次の項目について説明します。
4.1.3.1.1 インメモリー表
ヒープ構成表を移入の対象にするには、CREATE TABLE
文またはALTER TABLE
文で、INMEMORY
を指定します。
デフォルトでは、IM列ストアは表内のすべての非仮想列を移入します。内部表のすべての列または一部の列を指定できます。たとえば、oe.product_information
のweight_class
列およびcatalog_url
列を適格性から除外する場合があります。
パーティション表の場合、IM列ストア内のパーティション(すべてまたは一部)を移入できます。デフォルトでは、パーティション表内のすべてのパーティションはINMEMORY
属性を継承します。
Oracle Exadata Storage Serverでは、CELLMEMORY
キーワード(デフォルト)により、フラッシュ・キャッシュはインメモリー形式でデータを格納できます。ALTER TABLE
を使用して、FOR QUERY
またはFOR CAPACITY
圧縮を選択できます。NO CELLMEMORY
を指定すると、フラッシュ・キャッシュ内の列型記憶域が無効になります。
表をIM列ストアに対して有効化した場合に、その表に次のいずれかのタイプの列が含まれていても、これらはIM列ストアに移入されません。
-
表外格納列(VARRAY、ネストした表の列、およびアウトラインLOB)
ノート:
インラインLOB列の場合、IM列ストアは連続した最大4KBのバッファ記憶域を割り当て、インラインLOBにOSON (バイナリJSON)データが含まれている場合は最大32KBを割り当てます。アウトラインLOBの場合、IM列ストアはロケータに対して最大40バイトを割り当てますが、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
関連項目:
-
「インメモリー圧縮」
-
ALTER TABLE ... CELLMEMORY
についてさらに学習するには、Oracle Exadata System Softwareユーザーズ・ガイドを参照 -
CREATE TABLE
文のINMEMORY
句の詳細は、Oracle Database SQL言語リファレンスを参照
4.1.3.1.2 インメモリー外部表
外部表を移入の対象にするには、 CREATE TABLE ... EXTERNAL
文またはALTER TABLE ... EXTERNAL
文で、INMEMORY
を指定します。
インメモリー外部表の目的
インメモリー外部表は、次のような場合に役立ちます。
-
短期間に繰り返しスキャンする必要があり、Oracle Databaseに保存する必要がない短期データ
-
高速分析処理のためにリレーショナル・データに結合する必要がある外部データ
-
Oracle Databaseと外部ツールの両方で分析問合せによってアクセスされ、データベース記憶域でマテリアライズする必要がないデータ
パーティション化されたインメモリー外部表の制限
IM列ストアは、ヒープ構成表の場合と同じ方法で外部表のデータを管理しますが、次の相違点があります。
-
自動移入および再移入はサポートされていません。
DBMS_INMEMORY.REPOPULATE
を使用する必要があります。 -
column句、distribute句およびpriority句を含む、外部表の一部の
INMEMORY
副句は有効ではありません。 -
ORACLE_LOADER
およびORACLE_DATAPUMP
アクセス・ドライバのみがサポートされています。 -
インメモリー最適化算術は、外部表をサポートしていません。
-
インメモリー外部表に、パラレル実行ではアクセスできません。
-
インメモリー外部表では、パーティション化はサポートされていません。
-
インメモリー外部表では、結合グループはサポートされていません。
-
インメモリー外部表では、IM式はサポートされていません。
ノート:
インメモリーの外部表を問い合せるセッションでは、初期化パラメータQUERY_REWRITE_INTEGRITY
をstale_tolerated
に設定する必要があります。外部表を変更した場合、IM列ストアの結果は未定義です。
関連項目:
-
CREATE TABLE ... EXTERNAL
文のINMEMORY
句の詳細は、Oracle Database SQL言語リファレンスを参照 -
インメモリー外部表をサポートするエディションおよびサービスの詳細は、Oracle Databaseライセンス情報ユーザー・マニュアルを参照
4.1.3.1.3 インメモリー・マテリアライズド・ビュー
マテリアライズド・ビューを移入の対象にするには、CREATE MATERIALIZED VIEW
文またはALTER MATERIALIZED VIEW
文でINMEMORY
を指定します。
パーティション・マテリアライズド・ビューの場合、IM列ストア内のパーティションのすべて、またはサブセットを移入できます。
関連項目:
ALTER MATERIALIZED VIEW
の構文およびセマンティクスについては、Oracle Database SQL言語リファレンスを参照してください
4.1.3.1.4 インメモリー表領域
表領域を移入の対象にするには、CREATE TABLESPACE
文またはALTER TABLESPACE
文で、INMEMORY
を指定します。
デフォルトで、表領域内の表およびマテリアライズド・ビューはすべてIM列ストアに対して有効です。表領域内の個々の表およびマテリアライズド・ビューには、異なるINMEMORY
属性がある場合があります。個々のデータベース・オブジェクトの属性は、表領域の属性をオーバーライドします。
ノート:
一時表領域はインメモリー移入の対象ではありません。
関連項目:
ALTER TABLESPACE
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照してください
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 System 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列ストアに対して内部表または外部表のいずれかを有効にできます。列および優先度の副句を含む、一部のINMEMORY
副句は、外部表に対して有効ではありません。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。
新しい表をIM列ストアに対して有効にするには:
-
表の作成に必要な権限があるユーザーとして、データベースにログインします。
-
INMEMORY
句を指定してCREATE TABLE
文を実行します。
関連項目:
-
CREATE TABLE
文のINMEMORY
句の詳細は、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-10 フラッシュ・キャッシュでの列形式の無効化
デフォルトでは、Exadataスマート・フラッシュ・キャッシュは、レベルMEMCOMPRESS FOR CAPACITY LOW
を使用してデータを圧縮します。圧縮レベルを変更するか、列形式を完全に無効にするには、ALTER TABLE ... NO CELLMEMORY
文を使用します。
次の例では、フラッシュ・キャッシュ記憶域のoe.product_information
の列形式を無効にします。
ALTER TABLE oe.product_information NO CELLMEMORY;
4.2.4 外部表の作成および移入: 例
この例では、INMEMORY
オプションで外部表を作成し、IM列ストアに移入してからリフレッシュします。
次のコード例では、LinuxまたはUNIXホスト上にディレクトリ/tmp/data/
、/tmp/log/
および/tmp/bad/
を作成してあることを前提としています。
例4-11 INMEMORY属性を使用した外部表の作成
次のSQLスクリプトは、sh.sales
表からカンマ区切りのフラット・ファイル/tmp/data/sh_sales.csv
を作成します。ユーザーsh
としてスクリプトを実行します。
SET HEAD OFF
SET PAGES 0
SET FEEDBACK OFF
SET TERMOUT OFF
SPOOL /tmp/data/sh_sales.csv
SELECT prod_id || ',' || cust_id || ',' || time_id || ',' ||
channel_id || ',' || promo_id || ',' ||
quantity_sold || ',' || amount_sold
FROM sales;
SPOOL OFF
sh_sales.csv
ファイルを使用して、次のSQLスクリプトはINMEMORY
オプションで外部表sh.admin_ext_sales
を作成します。
CONNECT / AS SYSDBA;
-- Set up directories and grant access to sh
CREATE OR REPLACE DIRECTORY admin_dat_dir
AS '/tmp/data';
CREATE OR REPLACE DIRECTORY admin_log_dir
AS '/tmp/log';
CREATE OR REPLACE DIRECTORY admin_bad_dir
AS '/tmp/bad';
GRANT READ ON DIRECTORY admin_dat_dir TO sh;
GRANT WRITE ON DIRECTORY admin_log_dir TO sh;
GRANT WRITE ON DIRECTORY admin_bad_dir TO sh;
-- sh connects. Provide the user password (sh) when prompted.
CONNECT sh
-- create the external table
DROP TABLE admin_ext_sales;
CREATE TABLE admin_ext_sales
(prod_id NUMBER,
cust_id NUMBER,
time_id DATE,
channel_id NUMBER,
promo_id NUMBER,
quantity_sold NUMBER(10,2),
amount_sold NUMBER(10,2)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY admin_dat_dir
ACCESS PARAMETERS
(
records delimited by newline
badfile admin_bad_dir:'empxt%a_%p.bad'
logfile admin_log_dir:'empxt%a_%p.log'
fields terminated by ','
missing field values are null
( prod_id, cust_id,
time_id char date_format date mask "dd-mon-yy",
channel_id, promo_id, quantity_sold, amount_sold
)
)
LOCATION ('sh_sales.csv')
)
REJECT LIMIT UNLIMITED
INMEMORY;
ALL_EXTERNAL_TABLES
の次の問合せでは、admin_ext_sales
がINMEMORY
に対して有効になっていることを示しています。
COL OWNER FORMAT A10
COL TABLE_NAME FORMAT A15
SELECT OWNER, TABLE_NAME,
INMEMORY, INMEMORY_COMPRESSION
FROM ALL_EXTERNAL_TABLES
WHERE TABLE_NAME = 'ADMIN_EXT_SALES';
OWNER TABLE_NAME INMEMORY INMEMORY_COMPRESS
---------- --------------- -------- -----------------
SH ADMIN_EXT_SALES ENABLED FOR QUERY LOW
関連するビューには、ALL_XTERNAL_PART_TABLES
、ALL_XTERNAL_TAB_PARTITIONS
およびALL_XTERNAL_TAB_SUBPARTITIONS
が含まれます。
例4-12 IM列ストアへの外部表の移入
admin_ext_sales
表は、IM列ストアに対して有効になっていますが、まだ移入されていません。次の問合せは、ユーザーsh
として実行され、表を移入します。インメモリーの外部表の問合せでは、QUERY_REWRITE_INTEGRITY
初期化パラメータをstale_tolerated
に設定する必要があることに注意してください。
ALTER SESSION SET QUERY_REWRITE_INTEGRITY=stale_tolerated;
EXEC DBMS_INMEMORY.POPULATE('SH', 'ADMIN_EXT_SALES');
次の問合せは、admin_ext_sales
表が移入されていることを示しています。
COL OWNER FORMAT a3
COL NAME FORMAT a15
COL STATUS FORMAT a9
SELECT OWNER, SEGMENT_NAME NAME,
POPULATE_STATUS STATUS
FROM V$IM_SEGMENTS;
OWN NAME STATUS
--- --------------- ---------
SH ADMIN_EXT_SALES COMPLETED
例4-13 IM列ストアの外部表のリフレッシュ
レコードが次のように/tmp/data/sh_sales.csv
に追加されているとします。
echo "148,8787,23-NOV-01,2,999,1,23.43" >> /tmp/data/sh_sales.csv
内部表とは異なり、外部表は自動再移入メカニズムを使用しません。外部表をリフレッシュするには、DBMS_INMEMORY.REPOPULATE
プロシージャを使用する必要があります。完全スキャンでは、表に移入されません。
次の例では、IM列ストアがadmin_ext_sales
を移入するよう強制します。
EXEC DBMS_INMEMORY.REPOPULATE('SH', 'ADMIN_EXT_SALES');
admin_ext_sales
の問合せは、表が完全に移入されるまで正常に実行されません。
関連項目:
-
DBMS_INMEMORY.REPOPULATE
についてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 -
QUERY_REWRITE_INTEGRITY
、ALL_EXTERNAL_TABLES
およびその他の外部表ビューについて学習するには、Oracle Databaseリファレンスを参照
4.3 インメモリー表に対する列の有効化および無効化
内部表内の個々の列にINMEMORY
句を指定できます。外部表は、列レベルでの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列ストアの有効化」を参照してください。
-
仮想列を含む表がIM列ストアに対して有効になっている。
「IM列ストアに対する表の有効化および無効化」を参照してください。
-
INMEMORY_VIRTUAL_COLUMNS
初期化パラメータがDISABLE
に設定されていない。 -
初期化パラメータ
COMPATIBLE
の値が12.1.0
以上に設定されている。
IM仮想列を有効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY_VIRTUAL_COLUMNS
初期化パラメータをENABLE
に設定するか、特定の仮想列をIM列ストアに対して有効にします。
例4-14 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=SPFILE;
System altered.
例4-15 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-16 表領域の作成とIM列ストアに対する有効化
次の例では、users01
表領域を作成し、IM列ストアに対して有効にします。
CREATE TABLESPACE users01
DATAFILE 'users01.dbf' SIZE 40M
ONLINE
DEFAULT INMEMORY;
この例では、INMEMORY
句にデフォルトを使用しています。したがって、MEMCOMPRESS FOR QUERY
およびPRIORITY NONE
が使用されます。
例4-17 表領域の変更と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-18 マテリアライズド・ビューの作成と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-19 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パッケージおよびタイプ・リファレンス』を参照