21.1.12での変更点

新機能

  1. ネストされた配列とマップの索引付け、および問合せでのこのような索引の使用のサポートが追加されました。

    以前は、Oracle NoSQLは表の行ごとに1つの配列またはマップしか索引付けできませんでした。つまり、索引付けされた配列またはマップを別の配列またはマップ内にネストすることはできませんでした。このリリースでは、ネストされた配列およびマップの索引付けのサポートが追加されました。たとえば、航空旅行荷物に関する情報を記録する次の表を考えてみます。

    create table baggage (
      ticketNo string,
      passengerName string,
      bagInfo json,
      primary key(ticketNo))

    この表のサンプル行を次に示します。この行には、ticketNo 1762352483606の荷物が1つしかありませんが、一般に乗客には複数の荷物がある場合があり、その結果、bagInfoはドキュメントの配列になります。

    {
      "ticketNo" : "1762352483606",
      "passengerName" : "Willie Hernandez",
      "bagInfo" : [
        {
          "tagNum" : "17657806243915",
          "routing" : "MIA/LAX/MEL",
          "lastActionCode" : "OFFLOAD",
          "lastSeenStation" : "MEL",
          "lastSeenTimeGmt" : "2019.03.13 at 22:10:00 EDT",
          "flightLegs" : [
            {
              "flightNo" : "BM604",
              "flightDate" : "2019.03.12 at 20:00:00 EDT",
              "fltRouteSrc" : "MIA",
              "fltRouteDest" : "LAX",
              "estimatedArrival" : "2019.03.12 at 23:00:00 PDT",
              "actions" : [
                { "actionCode" : "ONLOAD to LAX",
                  "actionTime" : "2019.03.12 at 21:14:00 EDT" },
                { "actionCode" : "BagTag Scan at MIA",
                  "actionTime" : "2019.03.12 at 20:48:00 EDT"
                },
                { "actionCode" : "Checkin at MIA",
                  "actionTime" : "2019.03.12 at 19:50:00 EDT"
                }
              ]
            },
            {
              "flightNo" : "BM667",
              "flightDate" : "2019.03.12 at 23:14:00 PDT",
              "fltRouteSrc" : "LAX",
              "fltRouteDest" : "MEL",
              "estimatedArrival" : "2019.03.13 at 22:16:00 EDT",
              "actions" : [
                { "actionCode" : "Offload to Carousel at MEL",
                  "actionTime" : "2019.03.13 at 22:14:00 EDT"
                },
                { "actionCode" : "ONLOAD to MEL",
                  "actionTime" : "2019.03.13 at 03:35:00 PDT"
                },
                { "actionCode" : "OFFLOAD from LAX",
                  "actionTime" : "2019.03.13 at 03:19:00 PDT"
                }
              ]
            }
          ]
        }
      ]
    }

    次の索引を荷物表に作成できます。

    create index idx on baggage (
      bagInfo[].lastSeenStation as string,
      bagInfo.flightLegs[].fltRouteSrc as string,
      bagInfo.flightLegs[].flightDate as string)

    索引は荷物表の3フィールドを索引付けします: 1つは外部bagInfo配列のlastSeenStationフィールドで、もう2つはネストしたflightLegs配列のfltRouteSrcおよびflightDateフィールドです。baggageのサンプル行のこの索引の内容は、次のとおりです。

      [ "MEL", "MIA", "2019.03.12 at 20:00:00 EDT", "1762352483606" ]
      [ "MEL", "LAX", "2019.03.12 at 23:14:00 PDT", "1762352483606" ]

    次の問合せは、2019年全体でMIAからMELに移動したバッグの数を返します。WHERE句のすべての条件は、開始/停止述語として前述の索引にプッシュされます。

    select count(b.info.bagInfo.flightLegs[$element.fltRouteSrc ="MIA"])
        from baggage b
        where exists b.info.bagInfo[$element.lastSeenStation = "MEL"].
            flightLegs[$element.fltRouteSrc = "MIA" and
            $element.flightDate >= "2019.01.01" and
            $element.flightDate <= "2019.12.31"]
    [KVSTORE-271]
  2. 行ごとに生成される索引キーの最大数を制御するパラメータが追加されました。このパラメータは、rnMaxIndexKeysPerRowと呼ばれ、デフォルト値は10,000です。行が(最初にまたは更新後に)索引付けされるとき、行から抽出される索引キーの数が最大数を超えると、IllegalArgumentExceptionがスローされます。

    [KVSTORE-978]
  3. 表の列として格納されない行プロパティを抽出するために、次の5つの新しいSQL関数が追加されました。これらの関数のシグネチャでは、入力パラメータの型としてAnyRecordを指定していますが、関数では実際には入力として行が必要です。行を返す唯一の式は、行変数、つまり、名前が$で始まる表の別名です。

    integer partition(AnyRecord)
    行が属するパーティションを返します。
    integer shard(AnyRecord)
    現在、行が含まれているシャードを返します。
    integer row_storage_size(AnyRecord)
    最新バージョンの行のストレージ・サイズ(バイト単位)を返します。返されるサイズには、オーバーヘッド(ブックキーピング)バイトが含まれます。これには、古いバージョンの行のストレージ・サイズは含まれません(現在は廃止されており、ストレージ・エンジンのクリーナ・モジュールによって削除される可能性があります)。
    integer index_storage_size(AnyRecord, string)
    この関数の2番目の引数は、入力行を含む表の索引の名前である必要があります。この関数は、指定された索引から入力行を指す索引エントリのストレージ・サイズ(バイト単位)を返します。返されるサイズには、これらのエントリに関連付けられたオーバーヘッド(ブックキーピング)バイトが含まれます。
    注意: パフォーマンス上の理由から、異なる索引については、問合せにindex_storage_size関数への複数のコールを含めないことをお薦めします。
    timestamp(3) modification_time(AnyRecord)
    行の最新の変更時間を精度3 (ミリ秒)のタイムスタンプ値として返します。行が挿入後に変更されていない場合は、挿入時間を返します。

    次に、パーティションごとに、そのパーティションに含まれる表fooのすべての行を格納するために使用される合計バイト数を返す問合せの例を示します。

    select partition($f), sum(row_storage_size($f))
    from foo $f
    group by partition($f)
    [KVSTORE-127]
  4. SQL関数parse_json(string)が追加されました。JSONテキストと想定される文字列引数を、指定されたJSONを表すOracle NoSQL値に変換します。使用例を次に示します。

    create table foo (id integer, jcol json, primary key(id))
    
    insert into foo values (10, parse_json("{ \"name\" : \"john\", \"age\" : 30 }"))
  5. LEFT OUTER JOIN SQL構文をサポートします。

    NESTED TABLES句は、ターゲット表を中心とした多数の左外部結合操作と同じです。この機能では、標準ANSI SQLと互換性を持つようにLEFT OUTER JOIN (LOJ)構文がサポートされています。LOJの機能はNESTED TABLESのサブセットであり、線形のネストした表の問合せのみをサポートします。次に例を示します。

    create table A (ida integer, a1 string, primary key(ida));
    create table A.B (idb integer, b1 string, primary key(idb));
    create table A.B.C (idc integer, c1 integer, primary key(idc));
    
    select * from A a LEFT OUTER JOIN A.B b ON a.ida = b.ida
                      LEFT OUTER JOIN A.B.C c ON b.ida = c.ida and b.idb = c.idb
    [KVSTORE-265]
  6. 複数リージョンの表の整数型、長整数型および数値型の値のMRCounterをサポートします。これはリージョン間でレプリケートできるデータ構造で、レプリカは独立して更新され、常に正しい共通状態に収束できます。

    MRCounter列を作成する構文は、次のとおりです。

    AS MR_COUNTER

    このような列は、UPDATE DMLの+または-演算子を使用した場合にのみ更新できます。

    [KVSTORE-803]

バグとパフォーマンスの修正

  1. ストリームAPIが変更され、デフォルトでは、ソース・ストア内のシャードへの接続が切断されたときに、接続が戻るか、ユーザーがストリームを停止するまで無限に再接続するようになりました。現在、ストリームAPIは、ストリームを停止する前に制限まで再接続します。以前の動作では一貫性が優先されていましたが、新しい動作では一貫性よりも可用性が優先されます。ストリームAPIユーザーは、パブリックAPI NoSQLSubscriptionConfig.Builder.setMaxReconnect ()によってデフォルトの動作をオーバーライドできます。

    [KVSTORE-726]
  2. 永続書込み操作のみがストリームされるようにストリームAPIを変更しました。永続書込みとは、永続性設定を満たす書込みのみを意味します。たとえば、書込み操作に永続性設定COMMIT_SYNCが含まれている場合、それは大部分のレプリカによって確認された後にのみストリームされます。以前は、このような書込みは、大部分のレプリカによって確認される前にストリームされる可能性があり、マスターの移行時に、ストリームされた操作が新しいマスターから欠落する可能性がありました。

    [KVSTORE-686]
  3. 保留中のDDLを含むリージョンを削除してそのリモート・リージョンから複数リージョンの表を作成、変更または削除すると、そのリモート・リージョンを処理するリージョン・エージェントが正しく停止しない場合があるというバグが修正されました。したがって、リージョンが削除された直後にユーザーが複数リージョン表を再度作成した場合、XRegionサービスは、新しく作成された複数リージョン表を提供するために適切に機能しない可能性があります。

    [KVSTORE-901]
  4. サブスクライブされたすべての表がストリームからサブスクライブ解除されて空のストリームが作成され、後でユーザーが空のストリームに表をサブスクライブすると、ストリーム・クライアントがNullPointerExceptionをスローする可能性があるというバグが修正されました。

    [KVSTORE-904]
  5. 非同期実行メソッドのJavadocが改善されました。KVStoreインタフェースの「非同期実行のスレッド・モデル」の項を追加して、スレッド・モデルと、非同期実行後にトリガーされるユーザー指定のアクションの要件について説明しました。

    [KVSTORE-938]
  6. GCチューニングによる、より予測可能なレイテンシの実現。RNのGCパラメータに対して次の変更が行われました。
    • -XX:G1MixedGCCountTargetが32から12になりました。
    • - XX: ConcGCThreadsは-XX:ParallelGCThreadsと同じ値に設定されます。

    これらの変更により、フルGC一時休止の頻度が低くなります。ワークロードによっては、スループットが約5%低下する場合があります。

    [KVSTORE-888]
  7. 20.2ベースのサーバーと通信する19.3ベースのクライアント・ライブラリで実行されているhttpproxyインスタンスが問合せの実行に失敗する可能性があるというバグが修正されました。

    [KVSTORE-833]
  8. 地理検索関数のsearch-geometry引数が有効なジオメトリでない場合、問合せプロセッサで常にエラーが発生するようになりました。これまでは、引数が無効であることがコンパイル時に検出された場合にのみエラーが発生していました。そうでない場合、実行時に地理検索関数はfalseを返していました。

    [KVSTORE-805]
  9. 条件付き配列コンストラクタ式の戻り型の不正確な計算が原因でIllegalArgumentExceptionが発生するバグが修正されました。たとえば、IAEが次の問合せに対して発生します: select arr[] from Foo ここで、"arr"はARRAY(ARRAY(integer))型の表Fooの列です。これは、SELECTのarr[]式がARRAY(JSON)型の条件付き配列コンストラクタにラップされ、ARRAY(integer)型の値をARRAY(JSON)型の配列に挿入できないためです。これで、条件付き配列コンストラクタの型がARRAY(ANY)に設定されました。

    [KVSTORE-968]
  10. oracle.kv.Consistency.NONE_REQUIRED_NO_MASTER一貫性ポリシーのサポートが非推奨になったため、Oracle NoSQL Hadoop/Hive/BigDataSQL統合ではそのポリシーがサポートされなくなりました。これらの統合を使用するアプリケーションでは、かわりにoracle.kv.Consistency.NONE_REQUIRED一貫性ポリシーを使用する必要があります。

    [KVSTORE-837]
  11. KVStoreConfig.setSocketReadTimeoutを呼び出すことで変更できるソケット読取りタイムアウトは、デフォルトで有効になっている非同期ネットワーク・プロトコルを使用する場合、要求タイムアウトより大きくする必要はなくなりました。

    [KVSTORE-776]
  12. 指定されたサイズ制限で予期しない結果を返す全表スキャンに基づくGROUP BY問合せのバグが修正されました。バグはクラウド環境にのみ存在します。

    [NOSQL-338]
  13. UPDATE文のADD句でバインド変数が使用された場合に例外を引き起こすバグが修正されました。これは、バインド変数がターゲット配列に追加する新しい要素であり、位置式がない場合です。次に例を示します。

    declare $userid integer;
    update teams t
    add t.info.teams[1].userids $userid
    where id = 1
    returning *
    [KVSTORE-963]
  14. 問題のデバッグ時に役立てるために詳細情報が保持されるように、いくつかのデバッグおよびGCログ・パラメータのデフォルト値のサイズを大きくしました。また、JEデバッグ・ログ・ファイルのエントリが関連するサービス・デバッグ・ログ・ファイルに存在するため、領域を節約するために、JEデバッグ・ロギングをデフォルトで無効にしています。

    デフォルトのパラメータ値は、新しいストアおよび新しいサービスにのみ使用されることに注意してください。既存のストアをアップグレードする場合は、既存のサービスのこれらのパラメータを変更することをお薦めします。

    変更されたパラメータは次のとおりです:

    rnGCLogFileSize
    RNのGCログ・ファイルのデフォルトのファイル・サイズ制限が1048576バイト(1 MB)から5242880バイト(5 MB)に変更されました
    adminLogFileLimit
    管理用のデバッグ・ログ・ファイルのデフォルトのファイル・サイズ制限が4000000バイトから5242880バイト(5 MB)に変更されました
    GCLogFileSize
    管理用のGCログ・ファイルのデフォルトのファイル・サイズ制限が1048576バイト(1 MB)から5242880バイト(5 MB)に変更されました
    serviceLogFileLimit
    ストア全体のログ、statファイル、perfファイル、RNデバッグ・ログ・ファイルなど、その他のデバッグ・ログ・ファイルのデフォルトのファイル・サイズ制限が2000000バイトから5242880バイト(5 MB)に変更されました
    loggingConfigProps
    RNおよび管理用のロギング構成のデフォルト値をcom.sleepycat.je.util.FileHandler.level=OFFに設定し、JEデバッグ・ログ・ファイルへのロギングを無効にします
    [KVSTORE-878]
  15. SNの容量がRFの倍数ではない場合に不安定な再試行を回避するために、マスター・リバランスのバグが修正されました。

    [KVSTORE-869]
  16. UTCを示すISO8601形式のタイムスタンプ文字列から最後のZが欠落していたというバグが修正されました。

    [KVSTORE-801]
  17. 準備されたプロキシベースの問合せが表の削除後に実行された場合、NPEが発生します。これで、QueryExceptionが生成されます。

    [KVSTORE-920]
  18. 問合せでタイムスタンプ・フィールドがバインド変数と比較され、タイムスタンプ・フィールドが索引付けされている場合に例外が発生するバグが修正されました。

    また、タイムスタンプ・フィールドとタイムスタンプ値の精度が異なる場合に、タイムスタンプ・フィールドとタイムスタンプ値を比較する問合せでタイムスタンプ索引を使用できます。

    [KVSTORE-950]
  19. UNKNOWN状態でマスターではないRepNodeに書込み要求を送信できるまれな問題が修正されました。この場合、要求は失敗しますが、実際のマスターに送信された場合は成功します。クライアントは正しいノード・ステータス情報を取得し、マスターに要求を送信します。

    [KVSTORE-681]
  20. これらのパラメータの変更時にRNを再起動する必要があるように、rnRHAsyncMaxConcurrentRequests RepNodeパラメータが変更されました。再起動を必要としない、この値の変更をサポートするために必要な機能は、パフォーマンスに悪影響を及ぼしました。

    [KVSTORE-941]
  21. pingコマンドのJSON出力とテキスト出力の両方に、新しいブール属性isMasterBalancedが含まれます。値がfalseの場合、マスター状態のRepNodesが過剰であり、マスター状態のノードの1つ以上が将来の適切な時点でレプリカに遷移することを意味します。

    [KVSTORE-799]
  22. pingコマンドは、ストアが動作しているが一部のRepNodesがUNKNOWN状態のときに、終了コード103で終了するようになりました。

    [KVSTORE-756]
  23. pingコマンドの出力に、RepNodesおよびAdminsのストレージ・タイプに関する情報が含まれるようになりました。可能なストレージ・タイプは、次のとおりです。

    HD
    ハード・ディスク
    SSD
    ソリッド・ステート・デバイス、フラッシュベース
    NVME
    NVM Express、非揮発性メモリー
    HD (UNKNOWNの場合、デフォルト)
    実際のストレージ・タイプを判別できないため、ストレージ・タイプはハード・ディスクとみなされます。
    [KVSTORE-802]
  24. 20.3.17リリースを使用しているクライアントが20.3.17リリース以降のストアに接続しているときに、まれに操作が次のエラーで返される可能性があるバグが修正されました。

    java.lang.IllegalStateException: Expected state BEFORE_READ, was DONE
        at oracle.kv.impl.async.AbstractResultHandler.checkCallOnResult(AbstractResultHandler.java:71)
        at oracle.kv.impl.async.AbstractResultHandler.checkCallOnResult(AbstractResultHandler.java:49)
        at oracle.kv.impl.async.AbstractDelegatingResultHandler.onResult(AbstractDelegatingResultHandler.java:49)
        at oracle.kv.impl.async.AsyncVersionedRemoteDialogInitiator.onCanRead(AsyncVersionedRemoteDialogInitiator.java:157)
        at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.doWork(DialogContextImpl.java:1028)
        at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.run(DialogContextImpl.java:1017)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.runTasks(NioChannelExecutor.java:1493
    [KVSTORE-880]
  25. ネットワーク関連の問題がある場合に操作が次のエラーで返されるバグが修正されました。

    java.lang.IllegalStateException: Unexpected null read
        at oracle.kv.impl.async.AsyncVersionedRemoteDialogInitiator.onCanRead(AsyncVersionedRemoteDialogInitiator.java:131)
        at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.doWork(DialogContextImpl.java:1078)
        at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.run(DialogContextImpl.java:1049)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.runTasks(NioChannelExecutor.java:1655)
    [KVSTORE-899]
  26. ストレージ・ノードでCPUリソースが制限されていて、多数のクライアント接続がある場合にOutOfMemoryErrorが発生する可能性があるストレージ・ノードのスケーラビリティの問題が修正されました。

    [KVSTORE-390]
  27. 以前のバージョンでは、CREATE INDEXおよびCREATE FULLTEXT INDEXス文の構文で、マップ・フィールドの値に索引付けするときに角カッコ([<cond>?])を使用できました。このリリースでは、角カッコ([<cond>?])は使用できなくなり、.values(<cond>?)のみを使用できるようになりました。この新しい要件により、Elasticsearchの全文索引付けとの統合でバグが公開されました。このバグは、CREATE FULLTEXT INDEX文でカッコではなく.values(<cond>?)を使用して、特定のマップの値を索引付けするように指定した場合に発生します。このリリースで修正が提供されていない場合、Elasticsearchで索引付けするドキュメントを生成するメカニズムでは、間違ったマッピングが使用されます。これにより、マップの値に対する全文検索問合せが失敗します。このバグは修正されました。したがって、CREATE FULLTEXT INDEX文で.values(<cond>?)が使用されても、このような問合せは成功します。

    [KVSTORE-959]