23 JSON用のパフォーマンス・チューニングの概要

どのパフォーマンス・チューニングのアプローチを取るかは、アプリケーションのニーズによって決まります。ここでは、いくつかのユースケースと推奨されるソリューションについて説明します。

このユースケースは、2つの種類に分けられます。JSONフィールドの値に基づいたデータに対する検索またはアクセスが、(1)目的の文書で最大で1回実行されるものと、(2)場合によって1回より多く実行されるものの2つです。

特定の文書で最大1回行われる、フィールドの値にアクセスする問合せ

このような問合せのパフォーマンスは、非JSONデータの場合と同じ方法で調整できます。どのJSONフィールドで仮想列や索引を定義するか、インメモリー列ストア(IM列ストア)にJSONデータが格納された表を配置するか、フィールドの一部を投影するマテリアライズド・ビューを作成するか、といった選択は、非JSONの場合と類似しています。

しかし、JSONデータの場合には、このようなパフォーマンス・チューニングを少なくとも1つ適用することは、非JSONデータの場合よりも一般的により重要になります。このようなパフォーマンスの調整をせずにJSONフィールドにアクセスすることは、(非JSONの)列データにアクセスするよりも、通常より多くのコストがかかります。これは、目的のデータを特定するために、JSON文書を横断する必要があるためです。

JSONフィールドから仮想列を作成するか、JSONフィールドに索引付けを行います。

  • シンプルで高度に選択的な検索基準を使用した問合せを、単一のJSONフィールドに対して行う場合は、次のようにします。
    • フィールドに仮想列を定義します。

      多くの場合、IM列ストアに表を配置するか、仮想列に索引を作成することで、パフォーマンスをさらに向上させることができます。

    • SQL/JSONファンクションjson_valueを使用して、フィールドに関数ベースの索引を作成します。

  • 問合せに複数のフィールドが関連する場合は、次のようにします。

    • 各フィールドに仮想列を定義します。

      多くの場合、IM列ストアに表を配置するか、仮想列にコンポジット索引を作成することで、パフォーマンスをさらに向上させることができます。

    • SQL/JSONファンクションjson_valueを(フィールドごとに1回ずつ)複数回起動して、関数ベースのコンポジット索引を各フィールドに作成します。

特定の文書で複数回行われる可能性のある、フィールドの値にアクセスする問合せ

これは、配列内に含まれるフィールドにアクセスする場合に特に当てはまります。

このような問合せのパフォーマンスを調整するために使用できる3つの方法があります。

  • JSONデータが格納された表を、IM列ストアに配置します。

  • JSON検索索引を使用します。

    この方法では、JSON文書内のすべてのフィールドが、配列内に出現するフィールドも含めて、その値と一緒に索引付けされます。索引を使用すると、フィルタや全文演算子を含むパス式を使用した検索も含めて、任意のパスベースの検索を最適化できます。また、索引では、数値に対する範囲ベースの検索もサポートされます。

  • SQL/JSONファンクションjson_tableを使用してJSONフィールド値から投影された非JSON列のマテリアライズド・ビューを使用します。

    json_tableNESTED PATH句を使用して、JSON配列の各メンバーから個別の行を生成できます。

    マテリアライズド・ビューは、通常、JSONコンテンツ用のSQLベースのレポートおよび分析を最適化するために使用されます。