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
チェック制約を含めることができますが、このような制約を含めることは必須ではありません。
関連項目:
-
『Oracle Database VLDBおよびパーティショニング・ガイド』の「パーティション化の概要」
-
『Oracle Database概要』の仮想列
例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 |
---------------------------------------------------------
関連トピック
親トピック: JSONデータの格納および管理