10 JSONデータのパーティション化

パーティション化は、表内のデータの特定のサブセットのみを使用することでパフォーマンスを向上させることができます。JSONデータをパーティション化するには、JSON式列をパーティション化キーとして使用し、SQL/JSONファンクションjson_valueを使用して表内のJSONデータからスカラー列データを抽出します。

JSON式列は、仮想またはマテリアライズドにできます。頻繁に問い合せるデータの場合はマテリアライズド式列を使用することをお薦めします。この場合、その式はDML実行時に評価されて列値が取得され、それがディスクに書き込まれます。その後、そのマテリアライズド値は、必要なときにディスクから読み取られます。一方、仮想列の式は、列データにアクセスするたびに評価されます。実際には、マテリアライズド式列では式値がキャッシュされます。

ノート:

パーティション化キーによって、新しい表の行を挿入するパーティションが指定されます。パーティション化キーがJSON式列(仮想またはマテリアライズド)として定義されている場合、パーティション定義のjson_value式は、行が挿入されるたびに評価されます。この方法は、特に、大きなJSON文書の挿入ではコストがかかる可能性があります。

このため、ユースケースがハイブリッドである場合(リレーショナル・データとJSONデータを使用する場合)、挿入については、JSON列を使用してパーティション化するとパフォーマンスが向上する可能性があります。

読取りアクセスについては、マテリアライズド式列を使用する場合のパフォーマンスはJSON列と非JSON列とで違いはありません。これは、その式がDML実行時にすでに評価されており、その値は単にディスクから読み取られるだけであるためです。

JSON式列の使用による表のパーティション化のルール

  • パーティション化キーとして機能する式列は、SQL/JSONファンクションjson_valueを使用して定義する必要があります。

  • その列のデータ型は、json_value式によって返されたものです(RETURNING句または型変換項目メソッドによって決まります)。

  • その列のデータの抽出に使用されるパス式には述語を含めないようにする必要があります: このパスはストリーミング可能である必要があります。

  • その列を定義する式で参照されているJSON列にはis jsonチェック制約を含めることができますが、このような制約を含めることは必須ではありません

関連項目:

例10-1 JSONマテリアライズド式列を使用したパーティション化されたコレクション表の作成

この例では、数値のマテリアライズド式列po_num_vcを使用してパーティション化されている、JSONコレクション表purchaseorders_partitionedを作成します。その列を定義するjson_value式では、項目メソッドnumber()を使用して数値として文書からフィールドPONumberを抽出しています。

CREATE JSON COLLECTION TABLE orders
  (po_num_vc NUMBER GENERATED ALWAYS AS
    (json_value (DATA, '$.PONumber.number()'
     ERROR ON ERROR))
    MATERIALIZED)
  PARTITION BY RANGE (po_num_vc)
   (PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (2000));

CREATE JSON COLLECTION TABLEの詳細は、『Oracle Database SQL言語リファレンス』JSON記憶域句に関する項を参照してください

この問合せの実行では、パーティション化プルーニングが使用されます。

SELECT DATA FROM orders p
  WHERE p.data.PONumber.number() = 1234;

実行計画に操作PARTITION RANGE SINGLEが存在する場合は、プルーニングが使用されていることを示します。この計画は、パーティション2のみがアクセスされることを示しています。(パーティション2には、1000 <= 1234 < 2000であるため、部品番号1234が含まれます。)

---------------------------------------------------------
| Id  | Operation              | Name   | Pstart| Pstop |
---------------------------------------------------------
|   0 | SELECT STATEMENT       |        |       |       |
|   1 |  PARTITION RANGE SINGLE|        |     2 |     2 |
|   2 |   TABLE ACCESS FULL    | ORDERS |     2 |     2 |
---------------------------------------------------------