优化用于查询的 Azure Cosmos DB for NoSQL 容器索引策略

在针对 Azure Cosmos DB for NoSQL 帐户进行规划时,了解最常见的查询有助于优化索引策略,尽可能提高查询性能。

在此实验中,将通过数据资源管理器,使用默认索引策略和包含复合索引的索引策略来测试 SQL 查询。

创建 Azure Cosmos DB for NoSQL 帐户

Azure Cosmos DB 是一项基于云的 NoSQL 数据库服务,它支持多个 API。 在首次预配 Azure Cosmos DB 帐户时,可以选择希望该帐户支持的 API(例如 Mongo API 或 NoSQL API)。 完成 Azure Cosmos DB for NoSQL 帐户预配后,可以检索终结点和密钥,并使用它们通过 Azure SDK for .NET 或所选择的任何其他 SDK 连接到 Azure Cosmos DB for NoSQL 帐户。

  1. 在新的 Web 浏览器窗口或选项卡中,导航到 Azure 门户 (portal.azure.com)。

  2. 使用与你的订阅关联的 Microsoft 凭证登录到门户。

  3. 选择“+ 创建资源”,搜索“Cosmos DB”,然后使用以下设置创建新的“Azure Cosmos DB for NoSQL”帐户资源,并将所有其余设置保留为默认值:

    设置
    订阅 你的现有 Azure 订阅
    资源组 选择现有资源组,或创建新资源组
    帐户名 输入全局唯一名称
    位置 选择任何可用区域
    容量模式 无服务器

    📝 你的实验室环境可能存在阻止你创建新资源组的限制。 如果是这种情况,请使用现有的预先创建的资源组。

  4. 等待部署任务完成,然后继续执行此任务。

  5. 转到新创建的 Azure Cosmos DB 帐户资源,并导航到“数据资源管理器”窗格。

  6. 在“数据资源管理器”窗格中,选择“新建容器” 。

  7. 在“新建容器”弹出窗口中,为每个设置输入以下值,然后选择“确定” :

    设置
    数据库 ID 新建 | cosmicworks**
    容器 ID products
    分区键 /categoryId
  8. 返回到“数据资源管理器”窗格中,展开“cosmicworks”数据库节点,然后观察层次结构中的“products”容器节点。

  9. 在资源边栏选项卡中,导航到“键”窗格。

  10. 此窗格包含从 SDK 连接到帐户所需的连接详细信息和凭据。 具体而言:

    1. 请注意“URI”** 字段。 稍后在本练习中将用到此终结点值。

    2. 请注意“主键”** 字段。 稍后在本练习中将用到此键值。

  11. 打开 Visual Studio Code

使用示例数据为 Azure Cosmos DB for NoSQL 帐户设定种子

你将使用命令行实用工具来创建 cosmicworks 数据库和 products 容器。 然后,该工具将创建一组项,你将使用终端窗口中运行的更改源处理器来观察它们。

  1. Visual Studio Code 中,打开“终端”** 菜单,然后选择“新建终端”** 以打开新的终端。

  2. 在计算机上安装可全局使用的 [cosmicworks][nuget.org/packages/cosmicworks] 命令行工具。

     dotnet tool install cosmicworks --global --version 1.*
    

    💡 此命令可能需要几分钟时间才能完成。 如果你过去已经安装了此工具的最新版本,此命令将输出警告消息(*工具 “cosmicworks” 已安装)。

  3. 使用以下命令行选项运行 cosmicworks 以设置 Azure Cosmos DB 种子帐户:

    选项
    –endpoint 之前在本实验室中复制的终结点值
    –key 之前在本实验室中复制的键值
    –datasets product
     cosmicworks --endpoint <cosmos-endpoint> --key <cosmos-key> --datasets product
    

    📝 例如,如果终结点为:https­://dp420.documents.azure.com:443/,密钥为:fDR2ci9QgkdkvERTQ==,则命令为:cosmicworks --endpoint https://dp420.documents.azure.com:443/ --key fDR2ci9QgkdkvERTQ== --datasets product

  4. 等待 cosmicworks 命令完成对帐户的数据库、容器和项的填充。

  5. 关闭集成终端。

  6. 关闭 Visual Studio Code** 并返回浏览器。

执行 SQL 查询并测量其请求单位费用

在修改索引策略之前,先运行几个示例 SQL 查询,来获取以 RU 表示的基线请求单位费用。

  1. 在 Azure Cosmos DB 帐户资源中,导航到“数据资源管理器”窗格。

  2. 在“数据资源管理器”中,依次展开“cosmicworks”数据库节点和“products”容器节点,然后选择“新 SQL 查询”。

  3. 选择“执行查询”以运行默认查询:

     SELECT * FROM c
    
  4. 观察查询结果。 选择“查询统计信息”,查看以 RU 为单位的请求单位费用。

  5. 删除编辑器区域的内容。

  6. 创建一个新的 SQL 查询,该查询将从所有文档返回所有三个值:

     SELECT 
         p.name,
         p.categoryName,
         p.price
     FROM
         products p    
    
  7. 选择“执行查询”。

  8. 观察查询的结果和统计信息。 请求单位费用与第一个查询几乎相同。

  9. 删除编辑器区域的内容。

  10. 创建一个新的 SQL 查询,该查询将从所有文档按 categoryName 返回所有三个值:

     SELECT 
         p.name,
         p.categoryName,
         p.price
     FROM
         products p
     ORDER BY
         p.categoryName DESC
    
  11. 选择“执行查询”。

  12. 观察查询的结果和统计信息。 由于 ORDER BY 子句,请求单位费用增加了。

在索引策略中创建复合索引

现在,如果使用多个属性对项进行排序,将需要创建一个复合索引。 在此任务中,将创建一个复合索引,以便按 categoryName 对项进行排序,然后按其实际名称对项进行排序。

  1. 在“数据资源管理器”中,依次展开“cosmicworks”数据库节点和“products”容器节点,然后选择“新 SQL 查询”。

  2. 删除编辑器区域的内容。

  3. 创建一个新的 SQL 查询,该查询先按 categoryName 降序对结果进行排序,然后按 price 升序排序 :

     SELECT 
         p.name,
         p.categoryName,
         p.price
     FROM
         products p
     ORDER BY
         p.categoryName DESC,
         p.price ASC
    
  4. 选择“执行查询”。

  5. 查询应会失败,并显示错误:“order by”查询没有相应的复合索引可用于提供相应服务。

  6. 在“数据资源管理器”中,依次展开“cosmicworks”数据库节点和“products”容器节点,然后选择“设置”。

  7. 在“设置”选项卡中,导航到“索引策略”部分。

  8. 观察默认索引策略:

     {
       "indexingMode": "consistent",
       "automatic": true,
       "includedPaths": [
         {
           "path": "/*"
         }
       ],
       "excludedPaths": [
         {
           "path": "/\"_etag\"/?"
         }
       ]
     }    
    
  9. 将索引策略替换为修改后的 JSON 对象,然后保存更改:

     {
       "indexingMode": "consistent",
       "automatic": true,
       "includedPaths": [
         {
           "path": "/*"
         }
       ],
       "excludedPaths": [],
       "compositeIndexes": [
         [
           {
             "path": "/categoryName",
             "order": "descending"
           },
           {
             "path": "/price",
             "order": "ascending"
           }
         ]
       ]
     }
    
  10. 在“数据资源管理器”中,依次展开“cosmicworks”数据库节点和“products”容器节点,然后选择“新 SQL 查询”。

  11. 删除编辑器区域的内容。

  12. 创建一个新的 SQL 查询,该查询先按 categoryName 降序对结果进行排序,然后按 price 升序排序 :

     SELECT 
         p.name,
         p.categoryName,
         p.price
     FROM
         products p
     ORDER BY
         p.categoryName DESC,
         p.price ASC
    
  13. 选择“执行查询”。

  14. 观察查询的结果和统计信息。 此时,由于查询已完成,因此可以再次查看 RU 费用。

  15. 删除编辑器区域的内容。

  16. 创建一个新的 SQL 查询,该查询先按 categoryName 降序对结果进行排序,然后按 name 升序排序,最后按 price 升序排序 :

     SELECT 
         p.name,
         p.categoryName,
         p.price
     FROM
         products p
     ORDER BY
         p.categoryName DESC,
         p.name ASC,
         p.price ASC
    
  17. 选择“执行查询”。

  18. 查询应会失败,并显示错误:“order by”查询没有相应的复合索引可用于提供相应服务。

  19. 在“数据资源管理器”中,依次展开“cosmicworks”数据库节点和“products”容器节点,然后再次选择“设置”。

  20. 在“设置”选项卡中,导航到“索引策略”部分。

  21. 将索引策略替换为修改后的 JSON 对象,然后保存更改:

     {
       "indexingMode": "consistent",
       "automatic": true,
       "includedPaths": [
         {
           "path": "/*"
         }
       ],
       "excludedPaths": [],
       "compositeIndexes": [
         [
           {
             "path": "/categoryName",
             "order": "descending"
           },
           {
             "path": "/price",
             "order": "ascending"
           }
         ],
         [
           {
             "path": "/categoryName",
             "order": "descending"
           },
           {
             "path": "/name",
             "order": "ascending"
           },
           {
             "path": "/price",
             "order": "ascending"
           }
         ]
       ]
     }
    
  22. 在“数据资源管理器”中,依次展开“cosmicworks”数据库节点和“products”容器节点,然后选择“新 SQL 查询”。

  23. 删除编辑器区域的内容。

  24. 创建一个新的 SQL 查询,该查询先按 categoryName 降序对结果进行排序,然后按 name 升序排序,最后按 price 升序排序 :

     SELECT 
         p.name,
         p.categoryName,
         p.price
     FROM
         products p
     ORDER BY
         p.categoryName DESC,
         p.name ASC,
         p.price ASC
    
  25. 选择“执行查询”。

  26. 观察查询的结果和统计信息。 此时,由于查询已完成,因此可以再次查看 RU 费用。

  27. 关闭 Web 浏览器窗口或选项卡。