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/SQL TRUE値を引数HIDDENに指定し、追加されたすべての仮想列が非表示になるようにします。(HIDDENのデフォルト値はFALSEであり、これは追加された仮想列が非表示でないことを意味します。)

_________________________________________________________

関連項目:

関連トピック

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つを非表示にするために使用されます。

関連項目:

例24-9 JSON_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加

この例では、ファンクションjson_dataguideとJSON列dataを使用して取得した階層データ・ガイドを使用します。

追加された仮想列は、すべて表j_purchaseorder内の列です。IDDATE_LOADEDPODOCUMENTは例外です。

  • パラメータresolveNameConflictsTRUEで、名前の競合が解決されるようにします。(オプション。わかりやすくするため。これはどちらにしてもデフォルト値です。)

  • パラメータcolNamePrefix'DATA$'であり、これを列名のデフォルト接頭辞として使用します。

  • パラメータmixedCaseColumnsTRUEで、列名の大/小文字を区別します。つまり、大文字と小文字を区別します。

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_NumberPO_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%)に出現するスカラー・フィールド(配列下にないもの)を非表示の仮想列として投影します。

関連項目:

例24-11 配列下にないすべてのスカラー・フィールドの仮想列としての投影

追加された仮想列は、すべて表j_purchaseorder内の列です。IDDATE_LOADEDPODOCUMENTは例外です。これは、FREQUENCY引数がadd_virtual_columnsに渡されないため、すべてのスカラー・フィールド(配列下にないもの)が投影されます。

(名前がitalicdescribeコマンド出力内に記述された列は、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と同じですが、フィールドAllowPartialShipmentPhoneが投影されない点が異なります。これは、それらが文書の100%には出現しないためです。

(名前がitalicdescribeコマンド出力内に記述された列は、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から投影されたフィールドに対するこれを示します。

関連項目:

例24-14 JSONフィールドから投影された仮想列の削除

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'DATA');