一般的な操作に対して Azure Cosmos DB for NoSQL コンテナーのインデックス作成ポリシーを最適化する

書き込みの多いワークロードや大きな JSON オブジェクトを扱うワークロードでは、インデックス作成ポリシーをクエリで使用したいことがわかっているプロパティのインデックスのみを作成するように最適化すると都合が良い場合があります。

このラボでは、テスト用の .NET アプリケーションを使って Azure Cosmos DB for NoSQL コンテナーに大きな JSON 項目を挿入します。その際、既定のインデックス作成ポリシーを使用し、次に、少し調整したインデックス作成ポリシーを使用します。

開発環境を準備する

このラボで作業している環境に DP-420 のラボ コードのリポジトリをまだクローンしていない場合は、次の手順に従ってクローンします。 それ以外の場合は、以前にクローンしたフォルダーを Visual Studio Code で開きます。

  1. Visual Studio Code を起動します。

    📝 Visual Studio Code インターフェイスについてまだよく理解していない場合は、作業の開始に関するドキュメントをご覧ください

  2. コマンド パレットを開き、Git: Clone を実行して、任意のローカル フォルダーに https://github.com/microsoftlearning/dp-420-cosmos-db-dev GitHub リポジトリをクローンします。

    💡 Ctrl + Shift + P キーボード ショートカットを使用してコマンド パレットを開くことができます。

  3. リポジトリが複製されたら、Visual Studio Code で選択したローカル フォルダーを開きます。

Azure Cosmos DB for NoSQL アカウントを作成する

Azure Cosmos DB は、複数の API をサポートするクラウドベースの NoSQL データベース サービスです。 Azure Cosmos DB アカウントを初めてプロビジョニングするときに、そのアカウントでサポートする API (たとえば、Mongo APINoSQL API) を選択します。 Azure Cosmos DB for NoSQL アカウントのプロビジョニングが完了したら、エンドポイントとキーを取得し、Azure SDK for .NET または任意の他の SDK を使用して Azure Cosmos DB for NoSQL アカウントに接続する際に使用できます。

  1. 新しい Web ブラウザー ウィンドウまたはタブで、Azure portal (portal.azure.com) に移動します。

  2. ご利用のサブスクリプションに関連付けられている Microsoft 資格情報を使用して、ポータルにサインインします。

  3. [+ リソースの作成] を選択し、Cosmos DB を検索して、新しい Azure Cosmos DB for NoSQL アカウント リソースを作成します。以下を設定して、残りの設定はすべて既定値のままにします。

    設定 Value
    サブスクリプション ’‘既存の Azure サブスクリプション’’
    リソース グループ ’‘既存のリソース グループを選択するか、新しいものを作成します’’
    アカウント名 ’‘グローバルに一意の名前を入力します’’
    場所 ’‘使用可能なリージョンを選びます’’
    容量モード サーバーレス

    📝 ご利用のラボ環境には、新しいリソース グループを作成できない制限が存在する場合があります。 その場合は、事前に作成されている既存のリソース グループを使用します。

  4. デプロイ タスクが完了するまで待ってから、このタスクを続行してください。

  5. 新しく作成された Azure Cosmos DB アカウント リソースにアクセスし、[データ エクスプローラー] ペインに移動します。

  6. [データ エクスプローラー] ペインで、 [新しいコンテナー] を選択します。

  7. [新しいコンテナー] ポップアップで、各設定に次の値を入力してから [OK] を選択します。

    設定 Value
    データベース ID 新規作成 | cosmicworks
    コンテナー ID products
    パーティション キー /categoryId
  8. [データ エクスプローラー] ペインに戻り、cosmicworks データベース ノードを展開して、階層内の products コンテナー ノードを確認します。

  9. リソース ブレードで、[キー] ペインに移動します。

  10. このペインには、SDK からアカウントに接続するために必要な接続の詳細と資格情報が含まれています。 具体的な内容は次のとおりです。

    1. [URI] フィールドに注目します。 このエンドポイントの値は、この演習で後ほど使用します。

    2. [主キー] フィールドに注目してください。 このキーの値は、この演習で後ほど使用します。

  11. Visual Studio Code に戻ります。

既定のインデックス作成ポリシーを使用してテスト用の .NET アプリケーションを実行する

このラボでは、大きな JSON オブジェクトを受け取り、Azure Cosmos DB for NoSQL コンテナーに新しい項目を作成するテスト用の .NET アプリケーションが事前構築されています。 1 回の書き込み操作が完了すると、このアプリケーションから、項目の一意識別子と RU 料金がコンソール ウィンドウに出力されます。

  1. [エクスプローラー] ウィンドウで、23-index-optimization フォルダーを参照します。

  2. 23-index-optimization フォルダーのコンテキスト メニューを開き、[統合ターミナルで開く] を選択して新しいターミナル インスタンスを開きます。

    📝 このコマンドを実行すると、ターミナルが開き、開始ディレクトリが既に 23-index-optimization フォルダーに設定されています。

  3. [dotnet build][docs.microsoft.com/dotnet/core/tools/dotnet-build] コマンドを使用してプロジェクトをビルドします。

     dotnet build
    

    📝 コンパイラから、endpoint および key 変数は現在使用されていないという警告が表示される場合があります。 これらの変数はこのタスクで使用しますので、この警告は無視しても問題ありません。

  4. 統合ターミナルを閉じます。

  5. script.cs コード ファイルを開きます。

  6. endpoint という名前の string 変数を見つけます。 その値を、先ほど作成した Azure Cosmos DB アカウントのエンドポイントに設定します。

     string endpoint = "<cosmos-endpoint>";
    

    📝 たとえば、ご自分のエンドポイントが https­://dp420.documents.azure.com:443/ の場合、C# ステートメントは string endpoint = “https­://dp420.documents.azure.com:443/”; になります。

  7. key という名前の string 変数を見つけます。 その値を、先ほど作成した Azure Cosmos DB アカウントのキーに設定します。

     string key = "<cosmos-key>";
    

    📝 たとえば、キーが fDR2ci9QgkdkvERTQ== の場合、C# ステートメントは string key = “fDR2ci9QgkdkvERTQ==”; になります。

  8. script.cs コード ファイルを保存します。

  9. Visual Studio Code,で 23-index-optimization フォルダーのコンテキスト メニューを開き、[統合ターミナルで開く] を選択して新しいターミナル インスタンスを開きます。

  10. dotnet run コマンドを使用して、プロジェクトをビルドして実行します。

     dotnet run
    
  11. ターミナルからの出力を確認します。 項目の一意識別子と操作の要求料金 (RU 単位) がコンソールに出力されているはずです。

  12. dotnet run コマンドを使用して、さらに少なくとも 2 回プロジェクトをビルドして実行します。 コンソール出力で RU 料金を確認します。

     dotnet run
    
  13. 統合ターミナルは開いたままにします。

    📝 このターミナルは、この演習で後ほど、再度使用します。 元の RU 料金と更新された RU 料金を比較できるよう、ターミナルを開いたままにしておくことが重要です。

インデックス作成ポリシーを更新し、.NET アプリケーションを再実行する

このラボ シナリオでは、今後のクエリで name および categoryName プロパティに焦点を当てることを想定します。 大きな JSON 項目に最適化するには、すべてのパスを除外して開始するインデックス作成ポリシーを作成して、インデックスから他のすべてのフィールドを除外します。 次に、特定のパスを選択してポリシーに含めます。

  1. Web ブラウザーに戻ります。

  2. Azure Cosmos DB アカウント リソース内で、 [データ エクスプローラー] ペインに移動します。

  3. [データ エクスプローラー] で、cosmicworksデータベース ノード、products コンテナー ノードの順に展開してから、[設定] を選択します。

  4. [設定] タブで、[インデックス作成ポリシー] セクションに移動します。

  5. 既定のインデックス作成ポリシーを確認します。

     {
       "indexingMode": "consistent",
       "automatic": true,
       "includedPaths": [
         {
           "path": "/*"
         }
       ],
       "excludedPaths": [
         {
           "path": "/\"_etag\"/?"
         }
       ]
     }    
    
  6. インデックス作成ポリシーを、次の変更した JSON オブジェクトに置き換え、変更内容を保存します。

     {
       "indexingMode": "consistent",
       "automatic": true,
       "includedPaths": [
         {
           "path": "/name/?"
         },
         {
           "path": "/categoryName/?"
         }
       ],
       "excludedPaths": [
         {
           "path": "/*"
         },
         {
           "path": "/\"_etag\"/?"
         }
       ]
     }
    
  7. Visual Studio Code に戻ります。 開いているターミナルに戻ります。

  8. dotnet run コマンドを使用して、さらに少なくとも 2 回プロジェクトをビルドして実行します。 コンソール出力で新しい RU 料金を確認します。元の料金よりかなり低くなっているはずです。 すべての項目プロパティにインデックスを作成するわけではないため、インデックスを更新するときの書き込みコストが大幅に低くなります。 ただし、インデックスが作成されていないプロパティに対して読み取りでクエリを実行する必要がある場合は、多大なコストがかかる可能性があります。

     dotnet run
    

    📝更新された RU 料金が表示されない場合は、数分待つ必要があります。

  9. Web ブラウザーに戻ります。

    [インデックス作成ポリシー] ページが開かない場合は、[データ エクスプローラー] に移動し、cosmicworks データベース ノードを展開し、products コンテナー ノードで [設定] を選択して、[インデックス ポリシー] セクションに移動します。

  10. インデックス作成ポリシーを、次の変更した JSON オブジェクトに置き換え、変更内容を保存します。

     {
       "indexingMode": "none"
     }
    
  11. Web ブラウザーのウィンドウまたはタブを閉じます。

  12. Visual Studio Code に戻ります。 開いているターミナルに戻ります。

  13. dotnet run コマンドを使用して、さらに少なくとも 2 回プロジェクトをビルドして実行します。 コンソール出力で新しい RU 料金を確認します。元の料金よりかなり低くなっているはずです。 これはなぜでしょうか。 項目を書き込むときに、このスクリプトによって RU が測定されるため、インデックスを持たないことを選ぶと、そのインデックスを保守するオーバーヘッドが生じません。 裏を返すと、書き込みで生成される RU は少なくなりますが、読み取りのコストは非常に高くなります。

     dotnet run
    

    📝更新された RU 料金が表示されない場合は、数分待つ必要があります。

  14. Visual Studio Code を閉じます。