24.8 データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除
JSON列のデータ・ガイド情報に基づいて、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。投影されるスカラー・フィールドは、配列下にないフィールドです。
パフォーマンスを向上する目的で、仮想列を使用して次のすべてを実現できます。
-
列に索引を構築します。
-
オプティマイザ用に列の統計を収集します。
-
インメモリー列ストア(IM列ストア)に列をロードします。
ノート:
表ごとの仮想列の数は、初期化パラメータMAX_COLUMNS
の値によって制限されます。デフォルトでは、その値は最大1000列を意味するSTANDARD
です。『Oracle Databaseリファレンス』のMAX_COLUMNSに関する項を参照してください。
PL/SQLプロシージャDBMS_JSON.add_virtual_columns
を使用して、JSON列用にデータ・ガイド情報に基づく仮想列を追加します。仮想列を追加する前に、add_virtual_columns
プロシージャはまず、前に起動されたadd_virtual_columns
またはデータ・ガイド変更トリガー・プロシージャadd_vc
によって、同じJSON列のフィールドから作成された既存の仮想列をすべて削除します(実質上、DBMS_JSON.drop_virtual_columns
プロシージャの動作を実行していることになります)。
プロシージャadd_virtual_columns
に提供するデータ・ガイド情報には、これ以外に次の2つのソースがあります。
-
引数として渡す階層データ・ガイドまたはスキーマ・データ・ガイドからの情報があります。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。
この場合、データ・ガイドが投影するスカラー・フィールド(配列下にないもの)を指定するように編集してから、データ・ガイドを渡すことができます。この場合、データ・ガイド対応検索索引は必要ありません。
-
データ・ガイド対応JSON検索索引からの情報があります。
この場合、投影されるスカラー・フィールドの最小出現頻度を引数
FREQUENCY
の値としてプロシージャadd_virtual_columns
に指定できます。この場合、データ・ガイド対応検索索引が必要ですが、データ・ガイドは必要ありません。
また、追加した仮想列を非表示にすることも指定できます。SQL describe
コマンドでは、非表示にした列は列挙されません。
-
階層データ・ガイドまたはスキーマ・データ・ガイドを
add_virtual_columns
に渡す場合、特定のスカラー・フィールド(配列下にないもの)の投影を非表示の仮想列として指定できます。これは、データ・ガイドの列の説明に"o:hidden": true
を追加することで行います。 -
データ・ガイド対応JSON検索索引を
add_virtual_columns
とともに使用する場合、PL/SQLTRUE
値を引数HIDDEN
に指定し、追加されたすべての仮想列が非表示になるようにします。(HIDDEN
のデフォルト値はFALSE
であり、これは追加された仮想列が非表示でないことを意味します。)
_________________________________________________________
関連項目:
-
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.create_view_on_path
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
- 階層データ・ガイドまたはスキーマ・データ・ガイドに基づくJSONフィールドの仮想列の追加
階層データ・ガイドまたはスキーマ・データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。 - データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加
JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。 - データ・ガイド情報に基づくJSONフィールドの仮想列の削除
プロシージャDBMS_JSON.drop_virtual_columns
を使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。
関連トピック
親トピック: JSONデータ・ガイド
24.8.1 階層データ・ガイドまたはスキーマ・データ・ガイドに基づくJSONフィールドの仮想列の追加
階層データ・ガイドまたはスキーマ・データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。
データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。
階層データ・ガイドまたはスキーマ・データ・ガイドを取得するには、引数DBMS_JSON.FORMAT_HIERARCHICAL
またはDBMS_JSON.FORMAT_SCHEMA
をそれぞれ指定してOracle SQLファンクションjson_dataguide
を使用します。
取得したデータ・ガイドを編集することで、特定のスカラー・フィールド(配列下にないもの)のみを含め、フィールドの名前を変更し、フィールドの型の長さを変更できます。結果のデータ・ガイドに、新しい仮想列として投影されるこれらのフィールドが指定されます。配列下にないスカラー・フィールドでないデータ・ガイド内のすべてのフィールドは無視されます(投影されません)。
ノート:
スキーマ・データ・ガイドを使用して、特定のフィールドの仮想列を追加するとき、そのフィールドの値が文書セット内で異なるスカラー型である場合は、それらのスカラー型ごとに列が追加されます。最初の列以外のこのような複数列の名前には、フィールド名に_N
が付加されます(N
= 1、2、...)。
たとえば、ある文書でフィールドa
は数値であり、別の文書では文字列値である場合、1つはNUMBER
型、もう1つはVARCHAR2
型の2つの仮想列が作成されます。一方の列の名前はA
で、他方の列の名前はA_1
です。
PL/SQLプロシージャDBMS_JSON.add_virtual_columns
を使用して、投影されたフィールドを含むJSON列を格納する表に仮想列を追加します。まずプロシージャは、以前のadd_virtual_columns
の起動またはデータ・ガイド変更トリガー・プロシージャadd_vc
(実質的に、このプロシージャの実行内容はプロシージャDBMS_JSON.drop_virtual_columns
と同じ)によって同じJSON列内のフィールドから投影された既存の仮想列を削除します。
例24-9に、これを示します。これは、表j_purchaseorder
のJSON列data
にあるデータから、配列下にないスカラー・フィールドを投影します。投影されたフィールドは、データ・ガイド内で示されるフィールドです。
例24-10に、仮想列として2つのフィールドの投影を指定するデータ・ガイド引数を渡す方法を示します。データ・ガイド・フィールドo:hidden
は、これらの列の1つを非表示にするために使用されます。
関連項目:
-
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
PL/SQL定数
DBMS_JSON.FORMAT_HIERARCHICAL
およびDBMS_JSON.FORMAT_SCHEMA
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
例24-9 JSON_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加
この例では、ファンクションjson_dataguide
とJSON列data
を使用して取得した階層データ・ガイドを使用します。
追加された仮想列は、すべて表j_purchaseorder
内の列です。ID
、DATE_LOADED
、PODOCUMENT
は例外です。
-
パラメータ
resolveNameConflicts
はTRUE
で、名前の競合が解決されるようにします。(オプション。わかりやすくするため。これはどちらにしてもデフォルト値です。) -
パラメータ
colNamePrefix
は'DATA$'
であり、これを列名のデフォルト接頭辞として使用します。 -
パラメータ
mixedCaseColumns
はTRUE
で、列名の大/小文字を区別します。つまり、大文字と小文字を区別します。
DECLARE
dg CLOB;
BEGIN
SELECT json_dataguide(data, DBMS_JSON.FORMAT_HIERARCHICAL) INTO dg
FROM j_purchaseorder;
DBMS_JSON.add_virtual_columns('J_PURCHASEORDER',
'DATA',
dg,
resolveNameConflicts=>TRUE,
colNamePrefix=>'DATA$',
mixedCaseColumns=>TRUE);
END;
/
DESCRIBE j_purchaseorder;
Name Null? Type
-------------------------------- -------- ---------------------------
ID NOT NULL RAW(16)
DATE_LOADED TIMESTAMP(6) WITH TIME ZONE
DATA CLOB
DATA$User VARCHAR2(8)
DATA$PONumber NUMBER
DATA$Reference VARCHAR2(16)
DATA$Requestor VARCHAR2(16)
DATA$CostCenter VARCHAR2(4)
DATA$AllowPartialShipment VARCHAR2(4)
DATA$name VARCHAR2(16)
DATA$Phone VARCHAR2(16)
DATA$city VARCHAR2(32)
DATA$state VARCHAR2(2)
DATA$street VARCHAR2(32)
DATA$country VARCHAR2(32)
DATA$zipCode NUMBER
DATA$SpecialInstructions VARCHAR2(8)
例24-10 仮想列の追加(非表示および表示)
この例では、PO_Number
とPO_Reference
の2つのフィールドのみが仮想列として投影されます。データ・ガイドは、リテラル文字列としてローカルで定義されます。データ・ガイド・フィールドo:hidden
は、ここでPO_Reference
の仮想列を非表示にするために使用されます。(PO_Number
の場合、o:hidden: false
エントリは必要ありません。これは、false
がデフォルト値であるためです。)
DECLARE
dg CLOB;
BEGIN
dg := '{"type" : "object",
"properties" :
{"PO_Number" : {"type" : "number",
"o:length" : 4,
"o:preferred_column_name" : "PO_Number",
"o:hidden" : false},
"PO_Reference" : {"type" : "string",
"o:length" : 16,
"o:preferred_column_name" : "PO_Reference",
"o:hidden" : true}}}';
DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', dg);
END;
/
DESCRIBE j_purchaseorder;
Name Null? Type
----------- -------- ---------------------------
ID NOT NULL RAW(16)
DATE_LOADED TIMESTAMP(6) WITH TIME ZONE
DATA CLOB
PO_Number NUMBER
SELECT column_name FROM user_tab_columns
WHERE table_name = 'J_PURCHASEORDER' ORDER BY 1;
COLUMN_NAME
-----------
DATE_LOADED
ID
DATA
PO_Number
PO_Reference
5 rows selected.
関連トピック
24.8.2 データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加
JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。
プロシージャDBMS_JSON.add_virtual_columns
を使用して、仮想列を追加します。
例24-11に、これを示します。配列下にないすべてのスカラー・フィールドは、表j_purchaseorder
に仮想列として投影されます。
フィールドを投影するJSON列内の文書に関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内の各フィールドの出現頻度を記録します。
仮想列を追加するときは、所定の最小発生頻度のフィールドのみが投影されることを指定できます。
これには、パラメータFREQUENCY
の値として、プロシージャadd_virtual_columns
にゼロ以外の値を指定します。ゼロはデフォルト値であるため、引数FREQUENCY
を含めないと、すべてのスカラー・フィールド(配列下にないもの)が投影されます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。
例24-12は、文書のすべて(100%)に出現するすべてのスカラー(配列下にないもの)を仮想列として投影します。
追加されたすべての仮想列を非表示にする場合、TRUE
値を引数HIDDEN
に指定します。(パラメータHIDDEN
のデフォルト値はFALSE
であり、これは追加された仮想列が非表示でないことを意味します。)
例24-13は、文書のすべて(100%)に出現するスカラー・フィールド(配列下にないもの)を非表示の仮想列として投影します。
関連項目:
-
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
例24-11 配列下にないすべてのスカラー・フィールドの仮想列としての投影
追加された仮想列は、すべて表j_purchaseorder
内の列です。ID
、DATE_LOADED
、PODOCUMENT
は例外です。これは、FREQUENCY
引数がadd_virtual_columns
に渡されないため、すべてのスカラー・フィールド(配列下にないもの)が投影されます。
(名前がitalic
でdescribe
コマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_column
を使用して名前が変更された列です。)
EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA');
DESCRIBE j_purchaseorder;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL RAW(16)
DATE_LOADED TIMESTAMP(6) WITH TIME ZONE
DATA CLOB
DATA$User VARCHAR2(8)
PONumber NUMBER
DATA$Reference VARCHAR2(16)
DATA$Requestor VARCHAR2(16)
DATA$CostCenter VARCHAR2(4)
DATA$AllowPartialShipment VARCHAR2(4)
DATA$name VARCHAR2(16)
Phone VARCHAR2(16)
DATA$city VARCHAR2(32)
DATA$state VARCHAR2(2)
DATA$street VARCHAR2(32)
DATA$country VARCHAR2(32)
DATA$zipCode NUMBER
DATA$SpecialInstructions VARCHAR2(8)
例24-12 最小頻度のスカラー・フィールドの仮想列としての投影
文書のすべて(100%)に出現するすべてのスカラー・フィールドが、仮想列として投影されます。この結果は例24-11と同じですが、フィールドAllowPartialShipment
とPhone
が投影されない点が異なります。これは、それらが文書の100%には出現しないためです。
(名前がitalic
でdescribe
コマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_column
を使用して名前が変更された列です。)
EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', 100);
DESCRIBE j_purchaseorder;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL RAW(16)
DATE_LOADED TIMESTAMP(6) WITH TIME ZONE
DATA CLOB
DATA$User VARCHAR2(8)
PONumber NUMBER
DATA$Reference VARCHAR2(16)
DATA$Requestor VARCHAR2(16)
DATA$CostCenter VARCHAR2(4)
DATA$name VARCHAR2(16)
DATA$city VARCHAR2(32)
DATA$state VARCHAR2(2)
DATA$street VARCHAR2(32)
DATA$country VARCHAR2(32)
DATA$zipCode NUMBER
DATA$SpecialInstructions VARCHAR2(8)
例24-13 最小頻度のスカラー・フィールドの非表示の仮想列としての投影
この結果は例24-12と同じですが、追加されたすべての仮想列が非表示になることが異なります。(ビューUSER_TAB_COLUMNS
の問合せは、仮想列が実際に追加されたことを示します。)
EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', 100, TRUE);
DESCRIBE j_purchaseorder;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL RAW(16)
DATE_LOADED TIMESTAMP(6) WITH TIME ZONE
DATA CLOB
SELECT column_name FROM user_tab_columns
WHERE table_name = 'J_PURCHASEORDER'
ORDER BY 1;
COLUMN_NAME
-----------
DATE_LOADED
ID
PONumber
DATA
DATA$CostCenter
DATA$Reference
DATA$Requestor
DATA$SpecialInstructions
DATA$User
DATA$city
DATA$country
DATA$name
DATA$state
DATA$street
DATA$zipCode
24.8.3 データ・ガイド情報に基づくJSONフィールドの仮想列の削除
プロシージャDBMS_JSON.drop_virtual_columns
を使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。
DBMS_JSON.drop_virtual_columns
は、add_virtual_columns
の起動またはデータ・ガイド変更トリガー・プロシージャadd_vc
によって所定のJSON列内のフィールドから投影されたすべての仮想列を削除します。例24-14では、表j_purchaseorder
の列data
から投影されたフィールドに対するこれを示します。
関連項目:
-
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細)
例24-14 JSONフィールドから投影された仮想列の削除
EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'DATA');