読み取り負荷の高いインデックス パターンを確認する

完了

一部のアプリケーションのワークロードは読み取り中心で、各項目のさまざまなフィールドをフィルター処理する SQL クエリが必要になります。 このような読み取り中心のワークロードでは、クエリのパフォーマンスを最大化し、要求ユニット料金を最小限に抑えるために、可能な限り多くのフィールドを含む逆インデックスを作成するとメリットがあります。

既定では、Azure Cosmos DB for NoSQL を使用すると、ルート パスを含むインデックス作成ポリシーを含むコンテナーが作成されます。 この戦略によって、可能性があるすべての JSON プロパティが効率よくインデックスに含められます。 また、既定のインデックス作成ポリシーでは、既定で eTag プロパティ パスが除外されます。 逆インデックスでは、結果は、eTag を除くすべてのプロパティにインデックスを付けるインデックスになります。

これは、既定のインデックス作成ポリシーの完全な JSON オブジェクトです。

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/\"_etag\"/?"
    }
  ]
}

メタデータ オブジェクトを含む製品の JSON オブジェクトについて考えてみましょう。いくつかのフィールドはクエリで決して使用されず、description プロパティは、クエリ結果では使用されるが、大きさのためにフィルターには含められることがありません。

{
  "id": "3324789",
  "name": "Road-200 Green",
  "price": 510.55,
  "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras faucibus, turpis ut pulvinar bibendum, sapien mauris fermentum magna, a tincidunt magna diam tincidunt enim. Fusce convallis justo nulla, at tristique diam tempus vel. Suspendisse potenti. Curabitur rhoncus neque vel elit condimentum finibus. Nullam porta lorem vitae enim tincidunt elementum. Vestibulum id felis sit amet neque commodo scelerisque. Suspendisse euismod ex ut hendrerit eleifend. Quisque euismod consectetur vulputate.",
  "metadata": {
    "created_by": "sdfuouu",
    "created_on": "2020-05-05T19:21:27.0000000Z",
    "department": "cycling",
    "sku": "RD200-G"
  }
}

インデックス作成ポリシーを設計するときは、SQL クエリのニーズについて考慮する必要があります。 この架空の例では、SQL クエリで descriptionmetadata のプロパティが使用されることはありません。 このインデックス作成ポリシーを設計する最も簡単な方法は、すべてのパスを含めた後で、description および metadata プロパティ パスを選択して除外することです。

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/description/?"
    },
    {
      "path": "/metadata/*"
    }
  ]
}

または、すべてのパスを除外した後で、name および price プロパティ パスを選択して含めることもできます。

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/name/?"
    },
    {
      "path": "/price/?"
    }
  ],
  "excludedPaths": [
    {
      "path": "/*"
    }
  ]
}

ヒント

推奨される方法は、既定ですべてのインデックスを作成し、特定のパスを選択的に除外することです。 インデックス ポリシーを変更するには、インデックスの再構築が必要です。 この推奨される方法を適用すると、アプリケーションはスキーマの変更に適応し、クエリに新しいプロパティをすぐに使用できるようになります。