处理大型 Azure 资源数据集

Azure Resource Graph 旨在处理并获取 Azure 环境中资源的相关信息。 Resource Graph 加快了获取此类数据的速度,即使在查询数千条记录,也不例外。 Resource Graph 提供了多个大型数据集处理选项。

若要了解如何处理高频率查询,请转到针对受限制请求的指南

数据集结果大小

默认情况下,Resource Graph 限制任何查询都只能返回 1,000 条记录。 这项控制措施可保护用户和服务不受会生成大型数据集的意外查询影响。 当客户尝试通过查询来按照能满足自己特定需求的方式查找和筛选资源时,这种情况最为常见。 这项控制措施不同于使用 toplimit Azure 数据资源管理器语言运算符来限制结果。

注意

使用 first 时,建议使用 ascdesc 按至少一个列对结果排序。 如果不排序,则返回的结果是随机的且不可重复。

通过与 Resource Graph 交互的所有方法,都可以替代默认限制。 下面的示例展示了如何将数据集大小限制更改为 200:

az graph query -q "Resources | project name | order by name asc" --first 200 --output table
Search-AzGraph -Query "Resources | project name | order by name asc" -First 200

REST API 中,控制措施是 $top,它属于 QueryRequestOptions

最具限制性的控制措施将胜出。 例如,如果查询使用 toplimit 运算符,并生成多于 first 的记录,那么返回的记录数上限等于 first。 同样,如果 toplimit 小于 first,那么返回的记录集将是 toplimit 配置的较小值。

first 参数的最大允许值为 1000。

CSV 导出结果大小限制

使用 Azure Resource Graph 资源管理器的逗号分隔值 (CSV) 导出功能时,结果集限制为 55,000 条记录。 这是一个平台限制,不能通过提交 Azure 支持票证替换。

若要从 Azure 门户下载 CSV 结果,请浏览到 Azure Resource Graph 资源管理器并运行查询。 在工具栏上,选择“以 CSV 格式下载”。

跳过记录

下一个大型数据集处理选项是 skip 控制措施。 通过这项控制措施,查询可以在返回结果之前跳过或略过定义的记录数。 Skip 适用于以一种有意义的方式对结果进行排序的查询,查询意图是在结果集中间某位置处获取记录。 如果所需的结果位于返回数据集的末尾,更高效的做法是使用不同的排序配置,并从数据集顶部检索结果。

注意

使用 skip 时,建议使用 ascdesc 按至少一个列对结果排序。 如果不排序,则返回的结果是随机的且不可重复。 如果在查询中使用 limittake,则忽略 skip

下面的示例展示了如何跳过查询生成的前 10 条记录,改从第 11 条记录开始返回结果集:

az graph query -q "Resources | project name | order by name asc" --skip 10 --output table
Search-AzGraph -Query "Resources | project name | order by name asc" -Skip 10

REST API 中,控制措施是 $skip,它属于 QueryRequestOptions

分页结果

如果有必要将结果集拆分为更小的记录集进行处理,或者因为结果集会超过允许的最大返回记录数(即 1000 条),请使用分页。 REST API QueryResponse 提供指示结果集已拆分的值:resultTruncated$skipTokenresultTruncated 是布尔值,用于告知使用者返回的响应中是否还有其他记录。 如果 count 属性小于 totalRecords 属性,也可确定此条件。 totalRecords 定义匹配查询的记录数。

如果以下原因导致了可用资源少于查询请求的资源、禁用了分页或无法进行分页,则 resultTruncatedtrue

  • 查询包含limit or sample/take运算符。
  • 所有输出列都是 dynamicnull 类型。

如果 resultTruncatedtrue,则不会设置 $skipToken 属性。

以下示例演示了如何使用 Azure CLI 和 Azure PowerShell 跳过前 3,000 条记录,返回这些跳过的记录之后的 first 1,000 条记录:

az graph query -q "Resources | project id, name | order by id asc" --first 1000 --skip 3000
Search-AzGraph -Query "Resources | project id, name | order by id asc" -First 1000 -Skip 3000

重要

在以下情况下响应不包括 $skipToken

  • 查询包含limit or sample/take运算符。
  • 所有输出列都是 dynamicnull 类型。

有关示例,请转到 REST API 文档中的下一页查询

设置结果的格式

Resource Graph 查询的结果以两种格式提供:TableObjectArray。 可以使用作为请求选项一部分的 resultFormat 参数配置格式。 Table 格式是 resultFormat 的默认值。

默认情况下,来自 Azure CLI 的结果以 JSON 的形式提供。 Azure PowerShell 中的结果是 PSResourceGraphResponse 对象,但可以使用 data 属性上的 ConvertTo-Json cmdlet 快速转换为 JSON。 对于其他 SDK,可以将查询结果配置为输出 ObjectArray 格式。

格式 - Table

默认格式 Table 以 JSON 格式返回结果,旨在突出显示查询所返回的属性的列设计和行值。 该格式与结构化表或电子表格中定义的数据很类似,其中首先标识列,然后标识表示与这些列相对应的数据的行。

下面是一个使用 Table 格式设置的查询结果示例:

{
  "totalRecords": 47,
  "count": 1,
  "data": {
    "columns": [
      {
        "name": "name",
        "type": "string"
      },
      {
        "name": "type",
        "type": "string"
      },
      {
        "name": "location",
        "type": "string"
      },
      {
        "name": "subscriptionId",
        "type": "string"
      }
    ],
    "rows": [
      [
        "veryscaryvm2-nsg",
        "microsoft.network/networksecuritygroups",
        "chinaeast",
        "11111111-1111-1111-1111-111111111111"
      ]
    ]
  },
  "facets": [],
  "resultTruncated": "true"
}

格式 - ObjectArray

ObjectArray 格式也以 JSON 格式返回结果。 但是,这种设计与 JSON 中常见的键/值对关系保持一致,其中列和行数据在数组组中匹配。

下面是一个使用 ObjectArray 格式设置的查询结果示例:

{
  "totalRecords": 47,
  "count": 1,
  "data": [
    {
      "name": "veryscaryvm2-nsg",
      "type": "microsoft.network/networksecuritygroups",
      "location": "chinaeast",
      "subscriptionId": "11111111-1111-1111-1111-111111111111"
    }
  ],
  "facets": [],
  "resultTruncated": "true"
}

查询超时

Azure Resource Graph 强制执行 30 秒的查询超时,与 Azure 资源管理器保持一致。

可能的解决方法:

  • 使用较小的范围重试查询。 例如,查询较少的订阅。
  • 使用 join 的查询应在 join 左侧具有较小的结果集。

后续步骤