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_GRAPHSEM_APIS.ENABLE_INMEMORY_FOR_INF_GRAPHSEM_APIS.DISABLE_INMEMORY_FOR_RDF_GRAPHSEM_APIS.DISABLE_INMEMORY_FOR_INF_GRAPHの各プロシージャを使用して、指定したRDFグラフおよび推論グラフのRDFデータのインメモリー移入を有効または無効にすることもできます。

ノート:

Oracle Database In-MemoryでRDFを使用するには、『Oracle Database In-Memoryガイド』で説明されている、Oracle Database In-Memoryの有効化および構成方法を理解している必要があります。

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管理者ガイド』を参照してください。