1.16 RDFによるOracle Database In-Memoryのサポート
RDFでは、インメモリー列ストアなどの、Oracle Database In-Memoryの一連のインメモリー機能を使用して、リアルタイム分析および混合ワークロードのパフォーマンスを向上できます。
Database In-Memoryを設定したら、SEM_APIS.ENABLE_INMEMORYプロシージャを使用してRDFのインメモリー・ロードを実行できます。これには管理権限が必要で、RDFネットワークに影響します。これにより、頻繁に使用される列がRDF_LINK$表およびRDF_VALUE$表からメモリーにロードされます。
このプロシージャの実行後、RDFインメモリー仮想列をメモリーにロードできます。これは、RDFグラフ・コレクション・レベルで行われます。RDFグラフ・コレクションが作成されると、SEM_APIS.CREATE_RDF_GRAPH_COLLECTIONのコールでインメモリー・オプションを指定できます。
また、SEM_APIS.ENABLE_INMEMORY_FOR_RDF_GRAPH、SEM_APIS.ENABLE_INMEMORY_FOR_INF_GRAPH、SEM_APIS.DISABLE_INMEMORY_FOR_RDF_GRAPH、SEM_APIS.DISABLE_INMEMORY_FOR_INF_GRAPHの各プロシージャを使用して、指定したRDFグラフおよび推論グラフのRDFデータのインメモリー移入を有効または無効にすることもできます。
ノート:
Oracle Database In-MemoryでRDFを使用するには、『Oracle Database In-Memoryガイド』で説明されている、Oracle Database In-Memoryの有効化および構成方法を理解している必要があります。
親トピック: RDFグラフの概要
1.16.1 RDFのOracle Database In-Memoryの有効化
RDFデータをメモリーにロードするには、compatibility
を12.2以降に設定し、inmemory_size
値を100MB以上に設定する必要があります。これにより、SEM_APIS.ENABLE_INMEMORYプロシージャを使用してRDFネットワークをメモリーにロードできるようになります。
メモリー内でRDFデータを使用する前に、データがメモリーにロードされていることを確認する必要があります。
SQL> select pool, alloc_bytes, used_bytes, populate_status from V$INMEMORY_AREA; POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS -------------------------- ----------- ---------- -------------------------- 1MB POOL 5.0418E+10 4.4603E+10 DONE 64KB POOL 3202088960 9568256 DONE
POPULATE_STATUS
値がDONE
の場合、RDFデータはメモリーに完全にロードされています。
メモリー内のRDFデータが使用されているどうかを確認するには、実行計画でTABLE ACCESS INMEMORY FULL
を検索します。
--------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 580 (60)| 00:00:01 | | | | | |
| 1 | VIEW | | 1 | 13 | 580 (60)| 00:00:01 | | | | | |
| 2 | VIEW | | 1 | 13 | 580 (60)| 00:00:01 | | | | | |
| 3 | SORT AGGREGATE | | 1 | 16 | | | | | | | |
| 4 | PX COORDINATOR | | | | | | | | | | |
| 5 | PX SEND QC (RANDOM) | :TQ10000 | 1 | 16 | | | | | Q1,00 | P->S | QC (RAND) |
| 6 | SORT AGGREGATE | | 1 | 16 | | | | | Q1,00 | PCWP | |
| 7 | PX BLOCK ITERATOR | | 242M| 3697M| 580 (60)| 00:00:01 |KEY(I) |KEY(I) | Q1,00 | PCWC | |
| 8 | TABLE ACCESS INMEMORY FULL| RDF_LINK$ | 242M| 3697M| 580 (60)| 00:00:01 |KEY(I) |KEY(I) | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------------------------------------
RDFデータのインメモリー移入を無効にするには、SEM_APIS.DISABLE_INMEMORYプロシージャを使用します。
1.16.2 RDFでのインメモリー仮想列の使用
メモリー内のRDFデータに加え、RDFインメモリー仮想列を使用してRDF_LINK$表内のRDF語句の字句の値をメモリーにロードできます。RDFインメモリー仮想列をロードするには、まず、inmemory_virtual_columns
パラメータをENABLE
に設定し、管理権限を使用してSEM_APIS.ENABLE_INMEMORYを実行する必要があります。インメモリー仮想列がRDF_LINK$表に作成され、RDFグラフ収集レベルでメモリーにロードされます。
仮想列をメモリーにロードするには、SEM_APIS.CREATE_RDF_GRAPH_COLLECTIONのコールでオプション‘PXN=F INMEMORY=T’
を使用します。たとえば(RDFUSERという名前のデータベース・ユーザーが所有するNET1という名前のスキーマプライベート・ネットワークがあると仮定した場合):
EXECUTE SEM_APIS.CREATE_RDF_GRAPH_COLLECTION ('vm2',SEM_MODELS('lubm1k','univbench'),SEM_RULEBASES ('owl2rl'),options=>'PXN=F INMEMORY=T', network_owner=>'RDFUSER', network_name=>'NET1');
インメモリーRDFグラフ収集をチェックするには、SEM_MODEL$ビュー(INMEMORY列がT
に設定されているインメモリー・グラフ収集)を調べます。
インメモリーRDFグラフ・コレクションでは、RDF_VALUE$表との結合が不要になります。インメモリーRDFグラフ・コレクションの使用状況を確認するには、「RDFのOracle Database In-Memoryの有効化」に示したものと同じです。
移入されていない仮想列は実行時にアセンブルされ、このオーバーヘッドがパフォーマンスを損なう可能性があるため、最高のパフォーマンスを実現するには、問合せを処理する前にインメモリー仮想列を完全に移入してください。
1.16.3 Oracle Database In-Memoryでの不可視索引の使用
索引の使用によって、問合せのパフォーマンスの一貫性が損なわれる場合があります。異なるワークロード間で一貫したパフォーマンスが得られるようにするには、RDFネットワーク索引を不可視にして、問合せ実行がメモリーのスキャンによってのみ行われるようにします。ただしこの場合、索引を使用することで通常得られるパフォーマンスの向上が打ち消されます。次の例では、RDFUSERという名前のデータベース・ユーザーが所有する、NET1という名前のスキーマプライベート・ネットワークで、RDFネットワーク索引を非表示にします。
EXECUTE SEM_APIS.ALTER_RDF_INDEXES('VISIBILITY','N', network_owner=>'RDFUSER', network_name=>'NET1');
RDFネットワーク索引を再度可視にするには、次を使用します
EXECUTE SEM_APIS.ALTER_RDF_INDEXES('VISIBILITY','Y', network_owner=>'RDFUSER', network_name=>'NET1');
ノート:
RDF_VALUE$索引は、Oracle Databaseがコンパイル時に問合せ定数に対してVALUE_IDを効率的に参照できるように可視である必要があります。
不可視索引および使用不可の索引の詳細は、『Oracle Database管理者ガイド』を参照してください。