5 インメモリー移入に対するオブジェクトの手動による有効化
INMEMORY_AUTOMATIC_LEVEL
がHIGH
に設定されていない場合は、移入のためにオブジェクトを手動で有効または無効にして、圧縮および優先度オプションを設定する必要があります。
ノート:
INMEMORY_AUTOMATIC_LEVEL
にHIGH
が設定されていて、INMEMORY_FORCE
にBASE_LEVEL
が設定されていない場合は、データベースによって、すべてのオブジェクトでインメモリー移入が自動的に有効になり、必要に応じて移入および削除されます。DDL文に手動でINMEMORY
句を指定する必要はありません。
インメモリー移入に対するオブジェクトの手動による有効化について
INMEMORY
句のあるオブジェクトのみが、IM列ストアへの移入の対象になります。この句を手動で適用するには、CREATE TABLE
やALTER TABLE
などのDDL文を使用する必要があります。
インメモリー移入に対するオブジェクトの有効化の目的
オブジェクトにINMEMORY
属性がない場合は、そのオブジェクトは移入の対象になりません。
オブジェクトにINMEMORY
属性がある場合、そのオブジェクトはIM列ストアに存在している可能性があります。インメモリー移入は個別のステップであり、データベースがディスクから既存の行形式データを読み取って、そのデータを列形式に変換してIM列ストアに格納するときに発生します。
ノート:
移入は、ディスク上の既存のデータを列形式に変換することであり、新しいデータを列形式に変換する再移入とは異なります。IMCUは読取り専用の構造であるため、Oracle Databaseでは、それらは行の変更時に移入されません。正確に述べると、データベースでは、行変更がトランザクション・ジャーナルに記録されてから、再移入の一環として新しいIMCUが作成されます。
INMEMORY_AUTOMATIC_LEVEL
初期化パラメータをHIGH
に設定すると、すべてのオブジェクトがデフォルトでINMEMORY
になり、それによって自動的に移入の対象になります。個別のオブジェクトをINMEMORY
として指定するための手動のDDL文は不要です。INMEMORY_AUTOMATIC_LEVEL
がHIGH
でない場合は、手動でINMEMORY
句を指定する必要があります。
関連トピック
インメモリー・オブジェクトの制御
インメモリー・アクセスの表領域、表(内部および外部)、パーティションおよびマテリアライズド・ビューを使用可能にできます。圧縮や移入の優先度などのオプションも指定できます。
INMEMORY副句
INMEMORY
はセグメントレベルの属性で、列レベルの属性ではありません。ただし、INMEMORY
属性を、指定したオブジェクト内の列のサブセットに適用できます。
IM列ストアに対するオブジェクトを有効化または無効化するには、表領域、表およびマテリアライズド・ビューのDDL文にINMEMORY
句を指定します。DBA_TABLES
ビューのINMEMORY
列は、どの表にINMEMORY
属性が設定されている(ENABLED
)か、または設定されていない(DISABLED
)かを示します。
次のオブジェクトは、IM列ストアへの移入の対象ではありません。
-
索引
-
索引構成表
-
ハッシュ・クラスタ
-
SYS
ユーザーに所有されているか、SYSTEM
またはSYSAUX
表領域内に格納されているオブジェクト
インメモリー表
ヒープ構成表を移入の対象にするには、CREATE TABLE
文またはALTER TABLE
文でINMEMORY
句を指定します。
移入の対象になる列
デフォルトでは、IM列ストアは表内のすべての非仮想列を移入します。内部表のすべての列または一部の列を指定できます。たとえば、oe.product_information
のweight_class
列およびcatalog_url
列を適格性から除外する場合があります。
表をIM列ストアに対して有効化した場合に、その表に次のいずれかのタイプの列が含まれていても、これらはIM列ストアに移入されません。
-
表外格納列(VARRAY、ネストした表の列、およびアウトラインLOB)
ノート:
インラインLOB列の場合、IM列ストアは連続した最大4KBのバッファ記憶域を割り当て、インラインLOBにOSON (バイナリJSON)データが含まれている場合は最大32KBを割り当てます。アウトラインLOBの場合、IM列ストアはロケータに対して最大40バイトを割り当てますが、LOB自体は格納しません。
-
LONG
またはLONG RAW
データ型を使用する列 -
拡張データ型の列
Oracle Database 21c以降、INMEMORY TEXT
句を使用するとインメモリー全文列を指定できます。この列は、CONTAINS()
またはJSON_TEXTCONTAINS()
演算子を使用した高速インメモリー問合せをサポートするCHAR
、VARCHAR2
、CLOB
、BLOB
またはJSON
の列です。IM列ストアは、テキスト、JSON、XMLドキュメントなどの列データをドメイン固有のIM形式で格納します。
インメモリー・パーティション表
パーティション表については、INMEMORY
句を表レベルで指定できます。パーティション表は、外部パーティションのみ、内部パーティションのみ、または内部パーティションと外部パーティションの両方のハイブリッド混合を保持できます。デフォルトでは、パーティション表内のすべてのパーティションが表レベルのINMEMORY
句を継承します。この句は、個別のパーティションに指定することもできます。
Oracle Exadata Storage Serverのフラッシュ・キャッシュの列記憶域
Oracle Exadata Storage Serverでは、CELLMEMORY
キーワード(デフォルト)により、フラッシュ・キャッシュはインメモリー形式でデータを格納できます。ALTER TABLE
を使用して、FOR QUERY
またはFOR CAPACITY
圧縮を選択できます。NO CELLMEMORY
を指定すると、フラッシュ・キャッシュ内の列型記憶域が無効になります。
例5-1 表の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言語リファレンスを参照
インメモリー外部表
外部表を移入の対象にするには、CREATE TABLE
またはALTER TABLE
でEXTERNAL ... INMEMORY
句を指定します。
インメモリー外部表の目的
インメモリー外部表は、次のような場合に役立ちます。
-
短期間に繰り返しスキャンする必要があり、Oracle Databaseに保存する必要がない短期データ
-
高速分析処理のためにリレーショナル・データに結合する必要がある外部データ
-
Oracle Databaseと外部ツールの両方で分析問合せによってアクセスされ、データベース記憶域でマテリアライズする必要がないデータ
インメモリー外部表の仕組み
IM列ストアは、ヒープ構成表の場合と同じ方法で外部表のデータを管理します。たとえば、全表スキャンでは、内部表と外部表の両方をIM列ストアに移入します。外部表でサポートされるドライバは、インメモリー外部表でもサポートされます。
インメモリー外部表のユーザー・インタフェース
INMEMORY
句は、パーティション化された外部表またはハイブリッド・パーティション表の最上位レベルで指定できます。この句は、どのパーティションにも継承されます。個別のパーティションにINMEMORY
を指定することもできます。これにより、外部表内の異なるパーティションに異なるインメモリー指定が可能になります。
ノート:
IM外部表でサポートされていないハイブリッド表にINMEMORY
句を指定すると、そのような属性は内部パーティションにのみ継承されます。
インメモリー外部表の制限事項は、次のとおりです。
- インメモリー外部表では、サブパーティションはサポートされていません。
-
column句、distribute句およびpriority句を含む、外部表の一部の
INMEMORY
副句は有効ではありません。 -
インメモリー外部表では、結合グループはサポートされていません。
-
インメモリー最適化算術は、外部表をサポートしていません。
-
インメモリー外部表では、IM式はサポートされていません。
-
インメモリー外部表は、Oracle Active Data Guardインスタンスの
DISTRIBUTE ... FOR SERVICE
句をサポートしていません。
次に示す外部表のディクショナリ・ビューには、INMEMORY
列とINMEMORY_COMPRESSION
列があります。
-
DBA_XTERNAL_PART_TABLES
-
DBA_XTERNAL_TAB_PARTITIONS
-
DBA_XTERNAL_TAB_SUBPARTITIONS
ノート:
インメモリーの外部表を問い合せるセッションでは、初期化パラメータQUERY_REWRITE_INTEGRITY
をstale_tolerated
に設定する必要があります。
外部表が変更された場合、IM列ストアからの結果は未定義であることに注意してください。パーティションが(値を削除または追加して)変更された場合も、結果は未定義です。これにより、IMベースとIM以外のスキャンの結果に違いが生じる可能性があります。DBMS_INMEMORY.REPOPULATE
を実行してIMストアをリフレッシュし、表データと再同期化できます。
関連項目:
-
CREATE TABLE ... EXTERNAL
文のINMEMORY
句の詳細は、Oracle Database SQL言語リファレンスを参照 -
様々なエディションとサービスでサポートされる機能の詳細は、『Oracle Databaseライセンス情報ユーザー・マニュアル』を参照
インメモリー・マテリアライズド・ビュー
マテリアライズド・ビューを移入の対象にするには、CREATE MATERIALIZED VIEW
文またはALTER MATERIALIZED VIEW
文でINMEMORY
を指定します。
パーティション・マテリアライズド・ビューの場合、IM列ストア内のパーティションのすべて、またはサブセットを移入できます。
関連項目:
ALTER MATERIALIZED VIEW
の構文およびセマンティクスについては、Oracle Database SQL言語リファレンスを参照してください
インメモリー表領域
表領域を移入の対象にするには、CREATE TABLESPACE
文またはALTER TABLESPACE
文で、INMEMORY
を指定します。
デフォルトで、表領域内の表およびマテリアライズド・ビューはすべてIM列ストアに対して有効です。表領域内の個々の表およびマテリアライズド・ビューには、異なるINMEMORY
属性がある場合があります。個々のデータベース・オブジェクトの属性は、表領域の属性をオーバーライドします。
ノート:
一時表領域はインメモリー移入の対象ではありません。
関連項目:
ALTER TABLESPACE
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照してください
インメモリー・オブジェクトの移入の優先順位オプション
IM列ストアに対してオブジェクトを有効にする場合、オブジェクトを移入するタイミングをOracle Databaseで制御することも(デフォルト)、移入キューでのオブジェクトの優先度を決定するレベルを指定することもできます。
Oracle SQLには、移入のためにキューをより細かく制御できるようにするINMEMORY PRIORITY
句が組み込まれています。たとえば、あるデータベース・オブジェクトのデータを移入してから他のデータベース・オブジェクトのデータを移入することが、重要になったり重要でなくなったりすることがあります。
ビデオ:
次の表では、サポートされている優先度レベルを説明します。
表5-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言語リファレンス』を参照
インメモリー・オブジェクトの圧縮レベル
要件に応じて、様々なレベルでインメモリー・オブジェクトを圧縮できます。
一般には、圧縮は領域を節約するメカニズムです。ただし、IM列ストアでは、問合せパフォーマンスも向上させるアルゴリズムを使用して、データを圧縮できます。列データにMEMCOMPRESS FOR DML
またはMEMCOMPRESS FOR QUERY
オプションを使用すると、圧縮されたデータに対してSQL問合せが直接実行されます。そのため、スキャンおよびフィルタ操作は、少量のデータに対して行います。データベースでは、結果セットに必要な場合のみ、データが解凍されます。
ビデオ:
V$IM_SEGMENTS
およびV$IM_COLUMN_LEVEL
ビューでは、現在の圧縮レベルが示されます。適切なALTER
コマンドを使用することで、圧縮レベルを変更できます。表が現在IM列ストアに移入されており、PRIORITY
以外の表のINMEMORY
属性を変更した場合は、データベースでその表がIM列ストアから除去されます。再移入の動作は、PRIORITY
設定によって異なります。
INMEMORY_FORCE
初期化パラメータにBASE_LEVEL
が設定されている場合は、INMEMORY
オブジェクトおよび列でQUERY LOW
圧縮が自動的に使用されます。データ・ディクショナリ・ビューには既存の圧縮設定が引き続き表示される場合がありますが、ベース・レベルでは常にオブジェクトおよび列がQUERY LOW
レベルで透過的に圧縮されます。
次の表は、有効なINMEMORY MEMCOMPRESS
句のまとめを示しています。
表5-2 IM列ストアの圧縮レベル
CREATE/ALTER … INMEMORY構文 | 説明 |
---|---|
|
データは圧縮されません。 |
|
このレベルでは、DMLのパフォーマンスが最適になります。 このレベルでは、 ノート: この圧縮レベルは、Exadataフラッシュ・キャッシュの |
|
このレベルは、問合せパフォーマンスが最適になります。 IM列ストア・データの圧縮は、 このレベルは次のシナリオではデフォルトです。
|
|
このレベルでは、問合せパフォーマンスが向上し、領域が節約されます。 IM列ストアデータの圧縮は、 |
|
このレベルでは、領域節約になるような方向で、領域節約と問合せパフォーマンスのバランスがとられます。 IM列ストア・データの圧縮は、 このレベルは、 |
|
このレベルでは、最も優れた領域節約がもたらされます。 IM列ストア・データを最も大きく圧縮します。 |
|
このレベルは、 |
関連項目:
-
Database In-Memoryベース・レベルについて学習するには、CDBまたはPDBに対するIM列ストアの有効化を参照してください
-
ALTER TABLE ... CELLMEMORY
についてさらに学習するには、Oracle Exadata System Softwareユーザーズ・ガイドを参照 -
CREATE TABLE ... INMEMORY PRIORITY
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
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パッケージおよびタイプ・リファレンス』を参照してください。
IM列ストアに対する表の有効化および無効化
IM列ストアに対して表を有効にするには、CREATE TABLE
またはALTER TABLE
文でINMEMORY
句を指定します。IM列ストアに対して表を無効にするには、CREATE TABLE
またはALTER TABLE
文でNO INMEMORY
句を指定します。
インメモリー列ストアに対する新しい表の有効化
新しい表をIM列ストアに対して有効にするには、CREATE TABLE
文でINMEMORY
句を指定します。
IM列ストアに対して内部表または外部表のいずれかを有効にできます。列および優先度の副句を含む、一部のINMEMORY
副句は、外部表に対して有効ではありません。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「CDBまたはPDBに対するIM列ストアの有効化」を参照してください。
新しい表をIM列ストアに対して有効にするには:
-
表の作成に必要な権限があるユーザーとして、データベースにログインします。
-
INMEMORY
句を指定してCREATE TABLE
文を実行します。
関連項目:
-
CREATE TABLE
文のINMEMORY
句の詳細は、Oracle Database SQL言語リファレンスを参照
IM列ストアに対する既存の表の有効化および無効化
既存の表をIM列ストアに対して有効または無効にするには、ALTER TABLE
文でINMEMORY
句またはNO INMEMORY
句を指定します。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「CDBまたはPDBに対するIM列ストアの有効化」を参照してください。
IM列ストアに対して既存の表を有効または無効にするには:
-
ALTER TABLE
権限のあるユーザーとしてデータベースにログインします。 -
INMEMORY
句またはNO INMEMORY
句を指定してALTER TABLE
文を実行します。 -
必要な場合は、インメモリー・セグメントに関するメタデータ(サイズ、優先順位、圧縮レベル)を表示するために、
V$IM_SEGMENTS
を問い合せます。
関連項目:
-
ALTER TABLE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照 -
V$IM_SEGMENTS
ビューの詳細は、『Oracle Databaseリファレンス』を参照
IM列ストアに対する表の有効化および無効化
次の例では、IM列ストアに対して表を有効化または無効化する方法を示します。
インメモリー表の作成: 例
この例では、test_inmem
表を作成し、IM列ストアに対して有効にします。
この例では、test_inmem表を作成し、IM列ストアに対して有効にします。SQL*Plusで、表を所有するユーザーとしてデータベースにログインし、次のSQL文を実行します。
CREATE TABLE test_inmem ( id NUMBER(5) PRIMARY KEY, test_col VARCHAR2(15)) INMEMORY;
上の文では、INMEMORY
句のデフォルトであるMEMCOMPRESS FOR QUERY
およびPRIORITY NONE
が使用されます。PRIORITY
がNONE
になっているため、データベースは自動的に表を移入しません。
CREATE TABLE AS SELECT
)文を使用して作成し、同時に、Oracleが提供するshサンプル・スキーマからデータをプルする次の文を使用して、新しい表でインメモリーを有効にします。
CREATE TABLE test_inmem INMEMORY AS SELECT * FROM sh.sales;
INMEMORY
副句を含めることもできます:
CREATE TABLE test_inmem INMEMORY MEMCOMPRESS for capacity high AS SELECT * FROM sh.sales;
INMEMORY
句および関連する副句は、SELECT
の前に置く必要があります。ここでは、SELECT
の後に追加されています:
CREATE TABLE test_inmem AS SELECT * from sh.sales INMEMORY MEMCOMPRESS for capacity high;
この誤った使用方法では、INMEMORYは予約語ではなくキーワードとして解釈されます。暗黙的に無視され、INMEMORYは無効のままです。MEMCOMPRESS
はキーワードとしても解釈されますが、エラーが発生します。
インメモリー・パーティションを使用した表の作成: 例
この例では、パーティションのサブセットをINMEMORY
として指定して、range_sales
という名前のパーティション表を作成します。
新しい表を所有するユーザーとしてSQL*Plusにログインし、次のDDL文を実行します。
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));
前述のSQLでは、IM列ストア内の最初の3つのパーティションに対して、異なる圧縮レベルを指定しています。最後の2つのパーティションは、IM列ストアへの移入の対象ではありません。
インメモリー外部表の作成: 例
この例では、INMEMORY
オプションを使用して外部表を作成します。
この例では、ホストにディレクトリ/tmp/data/
、/tmp/log/
および/tmp/bad/
があることを前提としています。
次のSQLスクリプトは、sh.sales
表からカンマ区切りのフラット・ファイル/tmp/data/sh_sales.csv
を作成します。ユーザーsh
としてスクリプトを実行します。
SET HEAD OFF
SET TRIMSPOOL ON
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
が含まれます。
関連項目:
-
ALL_EXTERNAL_TABLES
および関連する外部表のビューについて学習するには、『Oracle Database Reference』を参照
パーティション化されたインメモリー外部表の作成: 例
この例では、INMEMORY
オプションを使用してパーティション化された外部表を作成します。
この例では、ホストにディレクトリ/tmp/data/
、/tmp/log/
および/tmp/bad/
があることを前提としています。
-
sh
ユーザーとしてデータベースにログインします。 -
次のSQLスクリプトを実行すると、カンマ区切りのフラット・ファイル
/tmp/data/sh_sales_98.csv
と/tmp/data/sh_sales_99.csv
がsh.sales
表から作成されます。SET ECHO OFF SET HEAD OFF SET TAB OFF SET PAGES 0 SET TRIMSPOOL ON SET FEEDBACK OFF SET TERMOUT OFF SPOOL /tmp/data/sh_sales_98.csv SELECT prod_id || ',' || cust_id || ',' || time_id || ',' || channel_id || ',' || promo_id || ',' || quantity_sold || ',' || amount_sold FROM sales WHERE time_id < TO_DATE('1999-01-01','SYYYY-MM-DD','NLS_CALENDAR=GREGORIAN'); SPOOL OFF SPOOL /tmp/data/sh_sales_99.csv SELECT prod_id || ',' || cust_id || ',' || time_id || ',' || channel_id || ',' || promo_id || ',' || quantity_sold || ',' || amount_sold FROM sales WHERE time_id > TO_DATE('1998-12-31','SYYYY-MM-DD','NLS_CALENDAR=GREGORIAN') AND time_id < TO_DATE('2000-01-01','SYYYY-MM-DD','NLS_CALENDAR=GREGORIAN'); SPOOL OFF
-
次のSQLスクリプトを実行して、
INMEMORY
オプションを指定した外部表sh.admin_ext_pt_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 partitioned table DROP TABLE admin_ext_pt sales; CREATE TABLE admin_ext_pt_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 ) ) ) REJECT LIMIT UNLIMITED INMEMORY PARTITION BY RANGE (time_id) ( PARTITION sales_1998 VALUES LESS THAN (TO_DATE('1996-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')) LOCATION('sh_sales_98.csv'), PARTITION sales_1999 VALUES LESS THAN (TO_DATE('1997-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')) LOCATION('sh_sales_99.csv') );
ノート:
表レベルではなく個別のパーティションに
INMEMORY
属性を適用するには、その属性をPARTITION ... LOCATION('part_name')
句の直後に指定します。 -
ALL_EXTERNAL_TABLES
を問い合せることで、INMEMORY
についてadmin_ext_pt_sales
表が使用可能であることを確認します。COL OWNER FORMAT A10 COL TABLE_NAME FORMAT A18 SELECT OWNER, TABLE_NAME, INMEMORY, INMEMORY_COMPRESSION FROM ALL_EXTERNAL_TABLES WHERE TABLE_NAME = 'ADMIN_EXT_PT_SALES'; OWNER TABLE_NAME INMEMORY INMEMORY_COMPRESS ---------- ------------------ -------- ----------------- SH ADMIN_EXT_PT_SALES ENABLED FOR QUERY LOW
関連するビューには、
ALL_XTERNAL_PART_TABLES
、ALL_XTERNAL_TAB_PARTITIONS
およびALL_XTERNAL_TAB_SUBPARTITIONS
が含まれます。 -
IM列ストアに
admin_ext_pt_sales
を移入します。EXEC DBMS_INMEMORY.POPULATE('SH', 'ADMIN_EXT_PT_SALES');
-
admin_ext_pt_sales
パーティションの移入ステータスを問い合せます。COL OWNER FORMAT a3 COL NAME FORMAT a18 COL PARTITION FORMAT a13 COL STATUS FORMAT a9 COL BNP FORMAT 99999 SELECT OWNER, SEGMENT_NAME NAME, PARTITION_NAME PARTITION, POPULATE_STATUS STATUS, BYTES_NOT_POPULATED AS "BNP" FROM V$IM_SEGMENTS; OWN NAME PARTITION STATUS BNP --- ------------------ ------------- --------- ------ SH ADMIN_EXT_PT_SALES SALES_1998 COMPLETED 0 SH ADMIN_EXT_PT_SALES SALES_1999 COMPLETED 0
この問合せは、2つの内部パーティションのみが移入されたことを示しています。
関連項目:
-
ALL_EXTERNAL_TABLES
および関連する外部表のビューについて学習するには、『Oracle Database Reference』を参照
ハイブリッド外部表の作成および移入: 例
この例では、INMEMORY
オプションを使用してハイブリッド外部表を作成し、内部と外部の両方のパーティションに移入します。
この例では、sh.sales
表が存在することを前提としています。目標は、2つの内部パーティションのあるハイブリッド・パーティション表sales_hpt
を作成することです。そのうちの1つはsh.sales
のデータを使用し、次に外部パーティションを1つ追加します。INMEMORY
属性をsales_hpt
に適用すると、この属性がすべてのパーティションに適用されます。
-
Linuxで一時ディレクトリを作成し、1行の売上データを含むテキスト・ファイルを作成します。
rm -rf /tmp/sales_data mkdir /tmp/sales_data echo "1002,110,19-MAR-2016,12,18,150,4800" > /tmp/sales_data/sales2016_data.txt
-
SQL*Plusで、管理者権限でログインして売上データ用のディレクトリ・オブジェクトを作成します。
CONNECT / AS SYSDBA CREATE DIRECTORY sales_data AS '/tmp/sales_data'; GRANT READ,WRITE ON DIRECTORY sales_data TO sh;
-
ユーザー
sh
としてログインし、sales_hpt
表を作成します。CONNECT sh DROP TABLE sales_hpt; CREATE TABLE sales_hpt ( prod_id NUMBER NOT NULL, cust_id NUMBER NOT NULL, time_id DATE NOT NULL, channel_id NUMBER NOT NULL, promo_id NUMBER NOT NULL, quantity_sold NUMBER(10,2) NOT NULL, amount_sold NUMBER(10,2) NOT NULL ) EXTERNAL PARTITION ATTRIBUTES ( TYPE ORACLE_LOADER DEFAULT DIRECTORY sales_data ACCESS PARAMETERS( FIELDS TERMINATED BY ',' (prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold) ) REJECT LIMIT UNLIMITED ) PARTITION BY RANGE (time_id) ( PARTITION sales_2014 VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy')), PARTITION sales_2015 VALUES LESS THAN (TO_DATE('01-01-2016','dd-mm-yyyy')), PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')) EXTERNAL LOCATION ('sales2016_data.txt') );
前述の文では、表に
sales_2014
、sales_2015
およびsales_2016
の3つのパーティションがあります。sales_2016
のみが外部として指定されています。 -
データ・ディクショナリを問い合せて、表がハイブリッドになっていることを確認します(出力例も示します)。
COL TABLE_NAME FORMAT a25 SELECT TABLE_NAME, HYBRID FROM USER_TABLES WHERE HYBRID = 'YES'; TABLE_NAME HYB ------------------------- --- SALES_HPT YES
-
内部パーティションの
sales_2014
とsales_2015
に行を挿入します。INSERT INTO sh.sales_hpt (SELECT * FROM sales); INSERT INTO sh.sales_hpt VALUES (30, 21086, TO_DATE('2015-12-30','SYYYY-MM-DD'), 2, 999, 1, 10.19); COMMIT;
前述の文の最初の部分で、すべての行が
sales
表から挿入されます。sales
のすべての日付は2002より前です。そのため、sales
のすべての行がsales_2014
パーティションに挿入されます。2番目の文は、sales_2015
パーティションに1行を挿入します。 -
パーティションを問い合せて、正しいデータが存在することを確認します。
SQL> SELECT COUNT(*) FROM sales_hpt PARTITION(sales_2014); COUNT(*) ---------- 918843 SQL> SELECT COUNT(*) FROM sales_hpt PARTITION(sales_2015); COUNT(*) ---------- 1 SQL> SELECT COUNT(*) FROM sales_hpt PARTITION(sales_2016); COUNT(*) ---------- 1
-
INMEMORY
属性を表レベルで適用し、データベースに対して強制的に表をIM列ストアに移入させます。ALTER TABLE sales_hpt INMEMORY; EXEC DBMS_INMEMORY.POPULATE('SH', 'SALES_HPT');
-
sales_hpt
パーティションの移入ステータスを問い合せます。COL OWNER FORMAT a3 COL SEGMENT FORMAT a18 COL PARTITION FORMAT a13 COL STATUS FORMAT a9 COL BNP FORMAT 99999 SELECT OWNER, SEGMENT_NAME SEGMENT, PARTITION_NAME PARTITION, IS_EXTERNAL AS EXT, POPULATE_STATUS STATUS, BYTES_NOT_POPULATED AS "BNP" FROM V$IM_SEGMENTS WHERE SEGMENT_NAME = 'SALES_HPT' ORDER BY PARTITION; OWN SEGMENT PARTITION EXT STATUS BNP --- ------------------ ------------- ----- --------- ------ SH SALES_HPT SALES_2014 FALSE COMPLETED 0 SH SALES_HPT SALES_2015 FALSE COMPLETED 0 SH SALES_HPT SALES_2016 TRUE COMPLETED 0
問合せによって、すべてのパーティション(内部と外部の両方)が移入されていることが示されます。
IM列ストアに対する既存の表の有効化: 例
この例では、IM列ストアに対して既存のsh.sales
表を有効にします。
SQL*Plusで、sh
ユーザーとしてデータベースにログインし、次のDDL文を実行します。
ALTER TABLE sales INMEMORY;
上の文では、INMEMORY
句のデフォルトであるMEMCOMPRESS FOR QUERY
およびPRIORITY NONE
が使用されます。
インメモリー圧縮をFOR CAPACITY LOWに設定する方法: 例
この例では、IM列ストアに対して既存のoe.product_information
表を有効にし、圧縮方法FOR CAPACITY LOW
を指定します。
SQL*Plusで、oe
ユーザーとしてデータベースにログインし、次のDDL文を実行します。
ALTER TABLE product_information
INMEMORY
MEMCOMPRESS FOR CAPACITY LOW;
上の文では、NONE
のPRIORITY
句にデフォルトを使用しています。次のように全表スキャンを強制的に実行して表に移入します(出力例も示します)。
SELECT /*+ FULL(p) NO_PARALLEL(p) */ COUNT(*)
FROM product_information p;
COUNT(*)
----------
288
別のセッションで、管理権限を持つユーザーとしてログインし、次の問合せを実行して圧縮率を計算します(出力例も示します)。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000
SELECT OWNER, SEGMENT_NAME, BYTES ORIG_SIZE,
INMEMORY_SIZE IN_MEM_SIZE,
ROUND (BYTES / INMEMORY_SIZE, 2) COMP_RATIO
FROM V$IM_SEGMENTS
WHERE SEGMENT_NAME LIKE 'P%'
ORDER BY 4;
OWNER SEGMENT_NAME ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ------------------- ---------- ----------- ----------
OE PRODUCT_INFORMATION 98304 1310720 .08
インメモリー優先度をHIGHに設定する方法:例
この例では、IM列ストアに対してoe.product_information
表を有効にし、表データをIM列ストアに移入するためにPRIORITY HIGH
を指定します。
SQL*Plusで、oe
ユーザーとしてデータベースにログインし、次のDDL文を実行します。
ALTER TABLE
product_information
INMEMORY
PRIORITY HIGH;
インメモリー表の圧縮および優先順位の設定の変更: 例
この例では、FOR CAPACITY HIGH
表圧縮とLOW
優先順位設定を使用するように、oe.product_information
表を変更します。
SQL*Plusで、管理ユーザーとしてデータベースにログインし、次の問合せを実行して、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;
IM列ストアに対する表の無効化: 例
IM列ストアに対して表を無効にするには、NO INMEMORY
句を指定します。
ユーザーoe
としてデータベースにログインし、次の文を実行して、IM列ストアのproduct_information
表を無効にします。
ALTER TABLE oe.product_information NO INMEMORY;
V$IM_SEGMENTS
ビューは、IM列ストアに移入されているデータベース・オブジェクトをリストします。
Exadataスマート・フラッシュ・キャッシュでの列形式の無効化: 例
この例では、Exadataスマート・フラッシュ・キャッシュ記憶域のoe.product_information
の列形式を無効にします。
デフォルトでは、Exadataスマート・フラッシュ・キャッシュは、レベルMEMCOMPRESS FOR CAPACITY LOW
を使用してデータを圧縮します。圧縮レベルを変更するか、列形式を完全に無効にするには、ALTER TABLE ... NO CELLMEMORY
文を使用します。
ユーザーoe
としてデータベースにログインし、次のDDL文を実行します。
ALTER TABLE product_information NO CELLMEMORY;
インメモリー表に対する列の有効化および無効化
内部表内の個々の列にINMEMORY
句を指定できます。外部表は、列レベルでのINMEMORY
の指定をサポートしません。
インメモリー列について
内部表の場合、インメモリー仮想列(IM仮想列)および非仮想列の両方がIM移入の対象です。外部表の場合、適格なのは非仮想列のみです。
選択列
デフォルトでは、INMEMORY
表のすべての列はIM列ストアに対して有効になっているために移入の対象になります。メモリーを節約するために、IM列ストアの対象にならない列のサブセットを作成できます。
ノート:
INMEMORY_FORCE
初期化パラメータにBASE_LEVEL
が設定されている場合は、INMEMORY
オブジェクトおよび列でQUERY LOW
圧縮が自動的に使用されます。データ・ディクショナリ・ビューには既存の圧縮設定が引き続き表示される場合がありますが、ベース・レベルでは常にオブジェクトおよび列がQUERY LOW
レベルで透過的に圧縮されます。
NO INMEMORY属性
INMEMORY
表の一部の列にNO INMEMORY
が指定されているときには、INMEMORY
列のみが移入の対象になります。
ノート:
除外する列は、表レベルでのみ指定できます。パーティションまたはサブパーティションには指定できません列のサブセットにNO INMEMORY
属性を適用するには、ALTER TABLE table_name INMEMORY ... NO INMEMORY excluded_columns
を指定します。このexcluded_columnsはNO INMEMORY
列のリストです。NO INMEMORY
属性のない列(除外される列のリストに存在しない列)のみが、セグメント・レベルのINMEMORY
属性を継承します。
次のDDL文は、employees
内のすべての列をインメモリーに対して有効にしますが、salary
列は除外します。
ALTER TABLE hr.employees INMEMORY NO INMEMORY (salary);
次の問合せV$IM_COLUMN_LEVEL
は、給与がNO INMEMORY
になっていることを示しています。
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 = 'EMPLOYEES'
ORDER BY COLUMN_NAME;
TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION
-------------------- -------------------- --------------------------
EMPLOYEES COMMISSION_PCT DEFAULT
EMPLOYEES DEPARTMENT_ID DEFAULT
EMPLOYEES EMAIL DEFAULT
EMPLOYEES EMPLOYEE_ID DEFAULT
EMPLOYEES FIRST_NAME DEFAULT
EMPLOYEES HIRE_DATE DEFAULT
EMPLOYEES JOB_ID DEFAULT
EMPLOYEES LAST_NAME DEFAULT
EMPLOYEES MANAGER_ID DEFAULT
EMPLOYEES PHONE_NUMBER DEFAULT
EMPLOYEES SALARY NO INMEMORY
関連項目:
-
INMEMORY
句の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照 -
移入されていない列にアクセスするブログ・エントリの場合は、https://blogs.oracle.com/in-memory/what-happens-if-a-column-is-not-populated
インメモリー・ハイブリッド・スキャン
インメモリー・ハイブリッド・スキャンでは、移入されていない列がある場合に、IM列ストアの表にアクセスします。
Oracle Database 21cより前は、問合せがNO INMEMORY
設定の列を参照していた場合、その問合せは行ストアからすべてのデータにアクセスしました。そのため、表スキャンでは列形式や述語プッシュダウンダウンなどのインメモリー機能を利用できませんでした。Oracle Database 21c以降では、INMEMORY
列とNO INMEMORY
列の両方を参照する問合せが列データにアクセスできます。
場合によっては、インメモリー・ハイブリッド・スキャンによってパフォーマンスを桁違いに向上させることができます。問合せに選択フィルタがある場合は、パフォーマンスが最大に向上します。この場合、IM列ストアは、行ストアで少数の行のみが投影されるように、ほとんどの行をフィルタですばやく除外できます。
最適なパフォーマンスを実現するために、オプティマイザは各種のアクセス方法を比較します。オプティマイザが表スキャンを選択した場合、記憶域エンジンは、通常の行ストア・スキャンよりもインメモリー・ハイブリッド・スキャンのほうがパフォーマンスが優れているかどうかを自動的に判断します。次の条件が満たされるときに、オプティマイザはハイブリッド・スキャンを考慮に入れます。
-
述語には
INMEMORY
列のみが含まれていること。 -
SELECT
リストには、INMEMORY
列とNO INMEMORY
列の任意の組合せが含まれていること。
たとえば、employees
表のsalary
列とcommission_pct
列がINMEMORY
と指定されているとします。first_name
列は、ほとんど参照されないため、NO INMEMORY
になっています。次の問合せはNO INMEMORY
列とINMEMORY
列の両方を参照するため、ハイブリッドIMスキャンの対象になります。
SELECT first_name FROM employees WHERE salary=6000 ORDER BY first_name;
SELECT first_name, salary AS base_sal, ((salary*commission_pct)+salary) AS total_sal
FROM employees
WHERE commission_pct=.1
ORDER BY total_sal DESC;
インメモリー・ハイブリッド・スキャンでは、論理的に作業を2つに分割します。その1つはIM列ストアに対する問合せを処理する部分で、もう1つは行ストアに対する問合せを処理する部分です。実行計画では、TABLE ACCESS INMEMORY FULL (HYBRID)
という操作はハイブリッド・スキャンを示します。実行時統計が、行ストアにのみアクセスすることでパフォーマンスが高くなることを示している場合、データベースは実行時にインメモリー・ハイブリッド・スキャンを無効にすることがあります。
例5-2 インメモリー・ハイブリッド・スキャン
この例では、amount_sold
を除くすべてのsales
列に対してインメモリー・アクセスを有効にします。
SH@21c:21c> ALTER TABLE sales INMEMORY NO INMEMORY (amount_sold);
Table altered.
IM列ストアに表を移入します。
SH@21c:21c> SELECT /*+ FULL(sales) NO_PARALLEL(sales) */ COUNT(*) FROM sales;
COUNT(*)
----------
918843
SUM
ファンクションをNO INMEMORY
列であるamount_sold
に適用して、述語ではINMEMORY
列のみを参照します。
SELECT SUM(amount_sold) AS revenue
FROM sales
WHERE time_id >= TO_DATE('1994-01-01', 'YYYY-MM-DD')
AND prod_id BETWEEN 30 and 40
AND quantity_sold < 2;
REVENUE
----------
7695555.89
次の実行計画のステップ3は、オプティマイザがインメモリー・ハイブリッド・スキャンを選択したことを示しています。
SH@21c> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
SQL_ID 6nz5k0y07akx8, child number 0
-------------------------------------
SELECT SUM(amount_sold) as revenue FROM sales WHERE time_id >=
TO_DATE('1994-01-01', 'YYYY-MM-DD') AND prod_id BETWEEN 30 and 40
AND quantity_sold < 2
Plan hash value: 3519235612
-------------------------------------------------------------------------------------------
|Id | Operation |Name|Rows|Bytes|Cost (%CPU)|Time|Pstart|Pstop|
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | |463 (100)| | | |
| 1 | SORT AGGREGATE | | 1 | 20 | | | | |
| 2 | PARTITION RANGE ALL | |196K|3834K|463 (2)|00:00:01| 1 | 28 |
|*3 | TABLE ACCESS INMEMORY FULL (HYBRID)| SALES|196K|3834K|463 (2)|00:00:01| 1 | 28 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(("PROD_ID"<=40 AND "PROD_ID">=30 AND
"TIME_ID">=TO_DATE(' 1994-01-01 00:00:00','syyyy-mm-dd hh24:mi:ss')
AND "QUANTITY_SOLD"<2))
IM仮想列
IM仮想列は、式を評価することによってその値が導出されること以外は、他の任意の列と同じです。
IM仮想列の目的
事前に計算されたIM仮想列の値をIM列ストアに格納すると、問合せのパフォーマンスが向上する可能性があります。式には、同じ表からの列、制約、SQL関数およびユーザー定義PL/SQL関数(DETERMINISTIC
のみ)を含めることができます。IM仮想列に明示的に書き込むことはできません。
仮想列は様々なコンテキストで使用されます。たとえば、INMEMORY
空間表に仮想列を追加し、SDO_FILTER
などの演算子を使用すると、空間索引を使用せずにその表を問い合せることができます。
IM仮想列のユーザー・インタフェース
IM列ストアにIM仮想列を移入するには、INMEMORY_VIRTUAL_COLUMNS
初期化パラメータを次のいずれかの値に設定します。
-
MANUAL
(デフォルト): 表がIM列ストアに対して有効になっている場合、この表で定義されているIM仮想列は、明示的にINMEMORY
として設定されていないかぎり、移入の対象ではありません。 -
ENABLE
: 表がIM列ストアに対して有効になっている場合、この表で定義されているすべてのIM仮想列は、明示的にNO INMEMORY
として設定されていないかぎり、移入の対象となります。デフォルトでは、IM列ストア内の列の圧縮レベルは、それが格納されている表またはパーティションと同じです。ただし、IM仮想列に対して異なる圧縮レベルが指定されている場合、それは指定された圧縮レベルで移入されます。
ノート:
仮想列またはIM式は、表内で許可されている上限までカウントされます。この上限はデフォルトでは1000ですが、MAX_COLUMNS
が有効になっている場合は、移入されるオブジェクトごとに4096列まで拡張できます。
関連項目:
MAX_COLUMNSの値を設定して、列の最大数を変更できます。IM列ストアにIM仮想列を移入しないように指定するには、この初期化パラメータをDISABLE:
に設定します。
INMEMORY_VIRTUAL_COLUMNS = "DISABLE"
IM仮想列およびIM式の基礎となる記憶域構造は同じです。ただし、IM式およびIM仮想列は異なるメカニズムで制御されます。
ノート:
-
IM列ストアでは、
INMEMORY
とマークされている表の仮想列のみが移入されます。 -
IM列ストアにIM仮想列を移入するには、
COMPATIBLE
初期化パラメータの値が12.1.0以上に設定されている必要があります。
関連項目:
IM全文列
インメモリー全文列は、INMEMORY TEXT
句で指定できます。
IM全文列の目的
以前のリリースでは、IM列ストアは、テキスト、XML、JSONなどの非スカラー・ドキュメント・オブジェクトに対する述語をサポートしていませんでした。こうしたタイプには、CLOB
列のCONTAINS()
など、独自のドメイン固有の述語や投影問合せ構成があります。高速述語評価には、Oracle全文索引、XML検索索引、JSON検索索引などのドメイン索引が必要でした。述語にCONTAINS()
またはJSON_TEXTCONTAINS()
演算子があるときは、最適化されたインメモリー検索が実行されます。
IM表スキャンでは、スカラーと非スカラーの両方のデータを評価できます。IM列ストアにスカラー列と非スカラー列が両方含まれている場合です。
全文列の仕組み
すべてのドメイン固有のデータ・オブジェクトは、そのドメイン固有の形式でIM列ストアに格納されます。IM全文機能では、次のデータ型がサポートされます。
-
CHAR
-
VARCHAR2
-
CLOB
-
BLOB
-
JSON
以前のリリースでは、CONTAINS()
やJSON_TEXTCONTAINS()
を使用する問合せは、テキスト索引とJSON検索索引でのみ評価されていました。Oracle Database 20以降では、ドキュメントを格納する基礎となる列をINMEMORY TEXT
として指定すると、問合せでSQL述語のそれらの演算子が評価されます。ドメイン固有の索引は、オプションです。
JSON列と非JSON列は、どちらもCTX_DDL.CREATE_POLICY
プロシージャによって作成されるカスタム索引付けポリシーをサポートしています。このプロシージャにはCTXAPP
ロールかCTXSYS.CTX_DDL
パッケージに対する実行権限が必要になります。列のデータ型がJSON
の場合、その列が次のいずれかを使用するときに、この列のIM全文バージョンでJSON_TEXTCONTAINS()
を使用したパス認識検索が可能になります。
-
デフォルト・ポリシー
-
JSON_ENABLED
属性がTRUE
に設定されているPATH_SECTION_GROUP
によるカスタム・ポリシー
全文列用のユーザー・インタフェース
CREATE TABLE
とALTER TABLE
は、どちらもINMEMORY TEXT
句をサポートしています。PRIORITY
句は、IM全文列の移入にも標準インメモリー列と同じ効果があります。デフォルトの優先度はNONE
です。MEMCOMPRESS
句は、INMEMORY TEXT
では無効です。
表5-3 INMEMORY TEXT句
構文 | 説明 |
---|---|
|
IM全文として有効にする列のリストを指定します。列のタイプは |
|
カスタム索引付けポリシーとともにIM全文として有効にする列のリストを指定します。列のタイプは |
表5-4 IM全文に関連する初期化パラメータ
構文 | 説明 |
---|---|
|
SQL内の |
|
IM仮想列として格納されるユーザー定義の仮想列を制御します。IM全文列では、 |
関連項目:
-
Oracle TextおよびJSONによる全文検索の使用方法についてさらに学習するには、『Oracle Textアプリケーション開発者ガイド』および『Oracle Database JSON開発者ガイド』を参照してください
-
CTX_DDL.CREATE_POLICY
について学習するには、『Oracle Textリファレンス』を参照してください -
INMEMORY
句の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
IM仮想列の有効化
IM仮想列により、計算の繰返しをなくすことで、問合せのパフォーマンスが向上します。また、データベースはSIMDベクター処理などの手法を使用してIM仮想列をスキャンおよびフィルタリングできます。
前提条件
IM仮想列を有効にするには、次の条件を満たしている必要があります。
-
IM列ストアがデータベースに対して有効になっている。
「CDBまたはPDBに対するIM列ストアの有効化」を参照してください。
-
仮想列を含む表は内部であり、
INMEMORY
属性が指定されていること。「IM列ストアに対する表の有効化および無効化」を参照してください。
-
INMEMORY_VIRTUAL_COLUMNS
初期化パラメータがDISABLE
に設定されていない。 -
初期化パラメータ
COMPATIBLE
の値が12.1.0
以上に設定されている。
IM仮想列を有効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY_VIRTUAL_COLUMNS
初期化パラメータをENABLE
に設定するか、特定の仮想列をIM列ストアに対して有効にします。
例5-3 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
を使用すると、変更はすぐに行われます。再起動は不要です。
例5-4 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);
例5-5 インメモリー空間表への仮想列の追加
この例では、位置データを含むが、最初は空間ジオメトリ列を含まない表を作成します。次に、空間ジオメトリ列を追加します。既存の緯度および経度の座標に基づいてジオメトリ・オブジェクトを移入するように表を更新します。空間メタデータも更新します。最後に、表をINMEMORYに変換し、空間列をINMEMORY SPATIAL
として指定してメモリー内空間索引を作成します。
-
サンプル表
city_points
を作成し、各都市内またはその近くの場所に一連の座標(latitude
およびlongitude
)を挿入します。CREATE TABLE city_points ( city_id NUMBER PRIMARY KEY, city_name VARCHAR2(25), latitude NUMBER, longitude NUMBER); INSERT INTO city_points (city_id, city_name, latitude, longitude) VALUES (1, 'Boston', 42.207905, -71.015625); INSERT INTO city_points (city_id, city_name, latitude, longitude) VALUES (2, 'Raleigh', 35.634679, -78.618164); INSERT INTO city_points (city_id, city_name, latitude, longitude) VALUES (3, 'San Francisco', 37.661791, -122.453613); INSERT INTO city_points (city_id, city_name, latitude, longitude) VALUES (4, 'Memphis', 35.097140, -90.065918);
- 空間ジオメトリ列を
city_points
表に追加します。ALTER TABLE city_points ADD (shape SDO_GEOMETRY);
- 挿入した位置座標に基づいて、ジオメトリ・オブジェクトを新しい列に移入します。
UPDATE city_points SET shape = SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(LONGITUDE, LATITUDE, NULL), NULL, NULL );
user_sdo_geom_metadata
ビューで空間メタデータを更新します。INSERT INTO user_sdo_geom_metadata VALUES ( 'city_points', 'SHAPE', SDO_DIM_ARRAY( SDO_DIM_ELEMENT('Longitude',-180,180,0.5), SDO_DIM_ELEMENT('Latitude',-90,90,0.5) ), 8307 ); commit;
city_points
表を変更して、IM列ストアへの移入の候補にします。表をINMEMORYとして指定します。この表にはshape
空間ジオメトリ列が含まれるため、INMEMORY SPATIAL
キーワードも含めます。ALTER TABLE city_points INMEMORY PRIORITY high INMEMORY SPATIAL (shape);
その後、
DBMS_INMEMORY.POPULATE
を使用してIM列ストアにcity_points
表を移入できます。EXEC DBMS_INMEMORY.POPULATE('chicago','city_points');
ノート:
仮想列は、空間ジオメトリ列の一部として作成されます。これは、In-Memory機能とは関係ありません。INMEMORY SPATIAL
キーワードを使用すると、IME列が1つ以上作成されます。
関連項目:
Spatial and Graph開発者ガイド。ここで、空間概念のより詳細な説明で同じ例が使用されています。例5-6 空間ダイジェストの使用(IM列ストアのMIN/MAX値IME)
SELECT city_name
FROM city_points c
where
sdo_filter(c.shape,
sdo_geometry(2001,8307,sdo_point_type(-122.453613,37.661791,null),null,null)
) = 'TRUE';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());
例5-7 空間を拡張しないDBIMの使用
SELECT * FROM city_points c where c.shape.sdo_point.x = -122.453613; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());
例5-8 仮想列の作成の検証
col table_name format a20
col column_name format a30
col data_type format a20
col data_default format a30 word_wrapped;
select
table_name, column_name, data_type, DATA_LENGTH, DATA_DEFAULT
from user_tab_cols
where column_name like 'SYS%';
SELECT * FROM city_points c;
city_points
サンプル表を削除してパージします。delete from user_sdo_geom_metadata where table_name = 'CITY_POINTS'; drop table city_points purge;
IM全文列の有効化
IM全文列を有効にするには、CREATE TABLE
およびALTER TABLE
文でINMEMORY TEXT
句を指定します。
前提条件
IM全文列を有効にするには、次の条件を満たしている必要があります。
-
IM列ストアがデータベースに対して必ず有効化されていること。
「CDBまたはPDBに対するIM列ストアの有効化」を参照してください。
-
IM仮想列を有効にする必要があります。
IM仮想列の有効化を参照してください。
-
MAX_STRING_SIZE
初期化パラメータはEXTENDED
に設定する必要があります。 -
カスタム索引付けポリシーを指定する場合は、そのポリシーが必ず存在していること。
ポリシーは、
CTX_DDL.CREATE_POLICY
で作成できます。このプロシージャには、CTXAPP
ロールまたはCTXSYS.CTX_DDL
パッケージに対するEXECUTE
権限が必要です。
IM全文列を有効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
次のいずれかの形式を使用して、
CREATE TABLE
文またはALTER TABLE
文でINMEMORY TEXT
句を指定します。-
INMEMORY TEXT (col1, col2, …)
-
INMEMORY TEXT (col1 USING policy1, col2 USING policy2, …)
-
例5-9 IM全文列の有効化
この例では、CTXAPP
ロールを持つユーザー・アカウントbiblio
でログインします。2つのIM全文検索列text_doc
とjson_doc
を保持する表を作成します。
CREATE TABLE books (id NUMBER, createTime DATE, text_doc CLOB, json_doc JSON)
INMEMORY TEXT(text_doc, json_doc);
テキスト検索用のカスタム・ポリシーを作成して、次のようにtext_doc
列に適用します。
EXEC CTX_DDL.CREATE_POLICY('book_search_policy');
ALTER TABLE books INMEMORY TEXT (text_doc USING 'book_search_policy');
JSON
データ型を使用するbooks.json_doc
列は、デフォルトのポリシーを使用する点に注意してください。
例5-10 INMEMORY TEXT列に対するカスタム・ポリシーの置換
この例では、2つのIM全文検索列text_doc
とjson_doc
によって、表books
が有効化されています。text_doc
列には、カスタム・ポリシーbook_search_policy
を使用します。既存のポリシーをbook_search_policy2
というポリシーに置き換えることが目的です。次のように、NO INMEMORY
属性を適用してから、INMEMORY
を適用する必要があります。
ALTER TABLE books NO INMEMORY TEXT(text_doc);
ALTER TABLE books INMEMORY TEXT (text_doc USING 'book_search_policy2');
関連項目:
-
「IM全文列」
-
CTX_DDL.CREATE_POLICY
について学習するには、『Oracle Textリファレンス』を参照してください -
INMEMORY
句の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
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列ストアに対して有効になりません。したがって、SELECT
リストと述語のいずれかでこれら2つの列を参照する問合せは、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リファレンス』を参照
NO INMEMORY表でのINMEMORY列属性の指定
INMEMORY
句は、INMEMORY
としてまだマークされていないオブジェクトの列レベルで指定できます。
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言語リファレンス』を参照してください。
INMEMORY(ALL)およびNO INMEMORY(ALL)副句
表のすべての列を含めるか除外する場合は、INMEMORY(ALL)
またはNO INMEMORY(ALL)
を使用できます。
NO INMEMORY(ALL)
Oracle Database 23aiでは、INMEMORY(ALL)およびNO IMEMORY(ALL)の後に包含リストまたは除外リストを指定して、インメモリーを有効または無効にする列を指定できます。これにより、列の非常に長い文字列を使用する必要が減り、インメモリーが有効な表の構成が以前のリリースよりも簡単になります。
NO INMEMORY(ALL)
は、すべての列をNO INMEMORY
としてマークします。
これらの副句が導入される前のCREATE TABLE
文またはALTER TABLE
文では、インメモリー列ストアに表の列のサブセットのみを追加する場合に、表INMEMORY
を宣言してから、NO INMEMORY
の後にすべての列のリストを指定する必要があります。この除外リストは長くなる場合があります。
NO INMEMORY(ALL)
句を使用すると、すべての列をNO INMEMORY
に設定してから、INMEMORY
を指定して、インメモリー列ストアに追加する列のサブセットの包含リストを指定できます。
たとえば、次の表foo
は数十個の列で作成されていますが、最初の3列のみをインメモリー列ストアに追加するとします:
CREATE TABLE foo ... NO INMEMORY(ALL) INMEMORY(c1, C2, C3);
INMEMORY(ALL)
INMEMORY(ALL)
は、すべての列をINMEMORY
としてマークします。その後、除外リストを追加することもできます。
表fooのほとんどの列をインメモリー列ストアに追加するが、列のサブセットを除外する必要があるとします。この場合、INMEMORY(ALL)
を指定してから、この句の後にNO INMEMORY
句および除外リストを指定できます:
CREATE TABLE foo ... INMEMORY(ALL) NO INMEMORY(c1, C2, C3);
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列ストアがデータベースに対して有効になっていることを確認します。「CDBまたはPDBに対するIM列ストアの有効化」を参照してください。
IM列ストアに対する表領域を有効化または無効化にします。
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY
句またはNO INMEMORY
句を指定して、CREATE TABLESPACE
またはALTER TABLESPACE
文を実行します。
例5-11 表領域の作成とIM列ストアに対する有効化
次の例では、users01
表領域を作成し、IM列ストアに対して有効にします。
CREATE TABLESPACE users01
DATAFILE 'users01.dbf' SIZE 40M
ONLINE
DEFAULT INMEMORY;
この例では、INMEMORY
句にデフォルトを使用しています。したがって、MEMCOMPRESS FOR QUERY
およびPRIORITY NONE
が使用されます。
例5-12 表領域の変更とIM列ストアに対する有効化
次の例では、IM列ストアに対して有効になるようにusers01
表領域を変更し、表領域内のデータベース・オブジェクトに対してFOR CAPACITY HIGH
圧縮を指定し、メモリーにデータを移入するためにPRIORITY LOW
を指定します。
ALTER TABLESPACE users01 DEFAULT INMEMORY
MEMCOMPRESS FOR CAPACITY HIGH
PRIORITY LOW;
IM列ストアに対するマテリアライズド・ビューの有効化および無効化
IM列ストアに対してマテリアライズド・ビューを有効および無効にすることができます。
IM列ストアに対してマテリアライズド・ビューを有効にするには、CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
文でINMEMORY
句を使用します。IM列ストアに対してマテリアライズド・ビューを無効にするには、CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
文でNO INMEMORY
句を使用します。
前提条件
IM列ストアがデータベースに対して有効になっていることを確認します。「CDBまたはPDBに対するIM列ストアの有効化」を参照してください。
IM列ストアに対してマテリアライズド・ビューを有効または無効にするには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY
句またはNO INMEMORY
句を指定して、CREATE MATERIALIZED VIEW
またはALTER MATERIALIZED VIEW
文を実行します。
例5-13 マテリアライズド・ビューの作成と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
を使用します。
例5-14 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言語リファレンス』を参照してください。