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_table
でNESTED PATH
句を使用して、JSON配列の各メンバーから個別の行を生成できます。マテリアライズド・ビューは、通常、JSONコンテンツ用のSQLベースのレポートおよび分析を最適化するために使用されます。