22.5 JSON_TABLEを使用したJSONデータに対するビューの作成
問合せのパフォーマンスを向上させるために、SQL/JSONファンクションjson_table
を使用して、列に投影するJSONデータに対してビューを作成できます。問合せのパフォーマンスをさらに向上させるには、マテリアライズド・ビューを作成し、JSONデータをインメモリーに配置できます。
例22-10では、JSONデータに対してビューを定義しています。ここでは、NESTED
パス句を使用して配列LineItems
の要素を投影しています。
例22-11では、例22-10と同じデータおよび構造を持つマテリアライズド・ビューを定義しています。
一般に、ビューは直接更新できません(マテリアライズドかどうかは関係ありません)。マテリアライズド・ビューの作成にキーワードREFRESH
およびON STATEMENT
が使用されている場合(例22-11を参照)、そのビューは元表が更新されるたびに自動的に更新されます。
json_table
を使用すると、任意のフィールドをビュー列として投影でき、(マテリアライズドかどうかにかかわらず)ビューの作成に任意の表の結合および任意の数のjson_table
の起動を含めることができます。
-
キーワード
MATERIALIZED
の使用 -
BUILD IMMEDIATE
の使用 -
REFRESH FAST ON STATEMENT WITH PRIMARY KEY
の使用。
REFRESH FAST
の使用は、マテリアライズド・ビューが増分的にリフレッシュされることを意味します。これが発生するようにするには、WITH PRIMARY KEY
またはWITH ROWID
(主キーがない場合)を使用する必要があります。表に基づいてマテリアライズド・ビューを作成する際には、JSON列が含まれるベースとなる表に主キーを指定し、WITH PRIMARY KEY
を使用することをお薦めします。REFRESH FAST
は、複数表マテリアライズド結合ビューおよび(単一または複数表)マテリアライズド集計ビューで使用できます。
ビューの作成にON COMMIT
(ON STATEMENT
ではなく)を使用できます。前者は、表の更新トランザクションがコミットされた場合にのみ、元表を使用してビューを同期します。それまで表の変更はビューに反映されません。ON STATEMENT
を使用すると、ビューがDML文ごとにただちに同期されます。これは、ON STATEMENT
を使用して作成したビューでは、実行される可能性のあるロールバックを反映することを意味します。(後続のCOMMIT
文がトランザクションを終了し、ロールバックを回避します。)
関連項目:
『Oracle Databaseデータ・ウェアハウス・ガイド』のマテリアライズド・ビューのリフレッシュに関する項
例22-10 JSONデータに対するビューの作成
CREATE VIEW j_purchaseorder_detail_view
AS SELECT po.id, jt.*
FROM j_purchaseorder po,
json_table(po.data, '$'
COLUMNS (
po_number NUMBER(10) PATH '$.PONumber',
reference VARCHAR2(30 CHAR) PATH '$.Reference',
requestor VARCHAR2(128 CHAR) PATH '$.Requestor',
userid VARCHAR2(10 CHAR) PATH '$.User',
costcenter VARCHAR2(16) PATH '$.CostCenter',
ship_to_name VARCHAR2(20 CHAR)
PATH '$.ShippingInstructions.name',
ship_to_street VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.street',
ship_to_city VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.city',
ship_to_county VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.county',
ship_to_postcode VARCHAR2(10 CHAR)
PATH '$.ShippingInstructions.Address.postcode',
ship_to_state VARCHAR2(2 CHAR)
PATH '$.ShippingInstructions.Address.state',
ship_to_zip VARCHAR2(8 CHAR)
PATH '$.ShippingInstructions.Address.zipCode',
ship_to_country VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.country',
ship_to_phone VARCHAR2(24 CHAR)
PATH '$.ShippingInstructions.Phone[0].number',
NESTED PATH '$.LineItems[*]'
COLUMNS (
itemno NUMBER(38) PATH '$.ItemNumber',
description VARCHAR2(256 CHAR) PATH '$.Part.Description',
upc_code NUMBER PATH '$.Part.UPCCode',
quantity NUMBER(12,4) PATH '$.Quantity',
unitprice NUMBER(14,2) PATH '$.Part.UnitPrice'))) jt;
例22-11 JSONデータに対するマテリアライズド・ビューの作成
CREATE MATERIALIZED VIEW j_purchaseorder_materialized_view
BUILD IMMEDIATE
REFRESH FAST ON STATEMENT WITH PRIMARY KEY
AS SELECT po.id, jt.*
FROM j_purchaseorder po,
json_table(po.data, '$'
COLUMNS (
po_number NUMBER(10) PATH '$.PONumber',
reference VARCHAR2(30 CHAR) PATH '$.Reference',
requestor VARCHAR2(128 CHAR) PATH '$.Requestor',
userid VARCHAR2(10 CHAR) PATH '$.User',
costcenter VARCHAR2(16) PATH '$.CostCenter',
ship_to_name VARCHAR2(20 CHAR)
PATH '$.ShippingInstructions.name',
ship_to_street VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.street',
ship_to_city VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.city',
ship_to_county VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.county',
ship_to_postcode VARCHAR2(10 CHAR)
PATH '$.ShippingInstructions.Address.postcode',
ship_to_state VARCHAR2(2 CHAR)
PATH '$.ShippingInstructions.Address.state',
ship_to_zip VARCHAR2(8 CHAR)
PATH '$.ShippingInstructions.Address.zipCode',
ship_to_country VARCHAR2(32 CHAR)
PATH '$.ShippingInstructions.Address.country',
ship_to_phone VARCHAR2(24 CHAR)
PATH '$.ShippingInstructions.Phone[0].number',
NESTED PATH '$.LineItems[*]'
COLUMNS (
itemno NUMBER(38) PATH '$.ItemNumber',
description VARCHAR2(256 CHAR) PATH '$.Part.Description',
upc_code NUMBER PATH '$.Part.UPCCode',
quantity NUMBER(12,4) PATH '$.Quantity',
unitprice NUMBER(14,2) PATH '$.Part.UnitPrice'))) jt;