顧客エンティティのパフォーマンスを測定する

この演習では、エンティティを個別のコンテナーとしてモデリングした場合と、エンティティを 1 つのドキュメントに埋め込む NoSQL データベースのモデリングを行った場合について、顧客エンティティの違いを測定します。

開発環境を準備する

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

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

    📝 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 で選択したローカル フォルダーを開きます。

  4. Visual Studio Code[エクスプローラー] ウィンドウで、16-measure-performance フォルダーを参照します。

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

  6. ターミナルが Windows Powershell ターミナルとして開く場合は、新しい Git Bash ターミナルを開きます。

    💡 Git Bash ターミナルを開くには、ターミナル メニューの右側で、+ 記号の横にあるプルダウンをクリックし、Git Bash を選択します。

  7. Git Bash ターミナルで、次のコマンドを実行します。 コマンドによってブラウザー ウィンドウが開き、指定されたラボ資格情報を使用する Azure portal に接続します。

     "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe" -m pip install pip-system-certs
     az login
     cd 16-measure-performance
     dotnet add package Microsoft.Azure.Cosmos --version 3.22.1
    
    

    💡 最初に [データ非正規化のコスト] ラボを実行し、そのラボによって作成された Azure リソースを削除しなかった場合は、統合ターミナルを閉じて、次の手順を無視して、次のセクションに進みます。 [データ非正規化のコスト] ラボによって作成されたリソースが既にあり、以下のスクリプトを実行しようとすると、スクリプトは失敗することに注意してください。

  8. Git Bash ターミナルで、次のコマンドを実行します。 このコマンドにより、新しい Azure Cosmos DB アカウントを作成するスクリプトが実行されてから、データベースにデータを入力して演習を完了するために使用するアプリがビルドされて起動されます。 提供された Azure アカウントの資格情報を入力すると、ビルドが完了するまでに 15 から 20 分かかることがあるため、コーヒーやお茶を飲むのにいいかもしれません。**

     bash init.sh
     dotnet build
     dotnet run --load-data
     echo "Data load process completed."
    
    
  9. 統合ターミナルを閉じます。

個別のコンテナー内にあるエンティティのパフォーマンスを測定する

Database-v1 では、データは個別のコンテナーに格納されます。 そのデータベースで、顧客、顧客住所、顧客パスワードを取得するクエリを実行します。 それぞれのクエリの要求料金を確認します。

顧客エンティティのクエリ

Database-v1 で、顧客エンティティを取得するクエリを実行し、要求料金を確認します。

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

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

  3. Azure portal のメニューまたは [ホーム] ページで、[Azure Cosmos DB] を選択します。
  4. 名前が cosmicworks で始まる Azure Cosmos DB アカウントを選択します。
  5. 左側で [データ エクスプローラー] を選択します。
  6. [Database-v1] を展開します。
  7. Customer コンテナーを選択します。
  8. 画面の上部にある [新しい SQL クエリ] を選択します。
  9. 次の SQL テキストをコピーして貼り付けてから、[クエリの実行] を選択します。

     SELECT * FROM c WHERE c.id = "FFD0DD37-1F0E-4E2E-8FAC-EAF45B0E9447"
    
  10. [Query Stats](クエリ統計情報) タブを選択し、2.83 の要求料金を確認します。

    データベースの顧客のクエリに関するクエリ統計情報を示すスクリーンショット。

顧客住所のクエリ

顧客住所エンティティを取得するクエリを実行し、要求料金を確認します。

  1. CustomerAddress コンテナーを選択します。
  2. 画面の上部にある [新しい SQL クエリ] を選択します。
  3. 次の SQL テキストをコピーして貼り付けてから、[クエリの実行] を選択します。

     SELECT * FROM c WHERE c.customerId = "FFD0DD37-1F0E-4E2E-8FAC-EAF45B0E9447"
    
  4. [Query Stats](クエリ統計情報) タブを選択し、2.83 の要求料金を確認します。

    データベースの顧客住所のクエリに関するクエリの統計情報を示すスクリーンショット。

顧客パスワードのクエリ

顧客パスワード エンティティを取得するクエリを実行し、要求料金を確認します。

  1. CustomerPassword コンテナーを選択します。
  2. 画面の上部にある [新しい SQL クエリ] を選択します。
  3. 次の SQL テキストをコピーして貼り付けてから、[クエリの実行] を選択します。

     SELECT * FROM c WHERE c.id = "FFD0DD37-1F0E-4E2E-8FAC-EAF45B0E9447"
    
  4. [Query Stats](クエリ統計情報) タブを選択し、2.83 の要求料金を確認します。

    データベースの顧客パスワードのクエリに関するクエリ統計情報を示すスクリーンショット。

要求料金を追加する

すべてのクエリを実行したので、それらにかかった要求ユニットのコストをすべて加算しましょう。

クエリ RU/s コスト
顧客 2.83
顧客住所 2.83
顧客パスワード 2.83
合計 RU/s 8.49

埋め込みエンティティのパフォーマンスを測定する

今度は、エンティティを 1 つのドキュメントに埋め込んだ状態で、同じ情報のクエリを実行します。

  1. Database-v2 データベースを選択します。
  2. Customer コンテナーを選択します。
  3. 次のクエリを実行します。

     SELECT * FROM c WHERE c.id = "FFD0DD37-1F0E-4E2E-8FAC-EAF45B0E9447"
    
  4. 返されるデータは、顧客、住所、パスワード データの階層になっていることを確認します。

    データベースの顧客に対するクエリ結果を示すスクリーンショット。

  5. [Query Stats](クエリの統計情報) を選択します。先ほど実行した 3 つのクエリの 8.49 RU/s に対し、要求料金が 2.83 であることを確認します。

2 つのモデルのパフォーマンスを比較する

実行した各クエリの RU/s を比較すると、顧客エンティティが 1 つのドキュメント内にある場合の最後のクエリは、3 つのクエリを個別に実行した場合の合計コストよりもはるかに低コストであることがわかります。 このデータが返されるまでの待機時間が短いのは、データが 1 回の操作で返されるからです。

1 つの項目を検索していて、データのパーティション キーと ID がわかっている場合、Azure Cosmos DB SDK の ReadItemAsync() を呼び出すことで、”ポイント読み取り” を介してこのデータを取得できます。 ポイント読み取りはクエリよりもさらに高速です。 同じ顧客データの場合、コストはわずか 1 RU/s と 3 倍近く改善されます。

クリーンアップ

このラボで作成したリソース グループを削除します。 リソース グループを削除するアクセス権がない場合は、このラボによって作成されたすべての Azure オブジェクトを削除します。