获取查询性能数据分析

本文档介绍了如何使用查询执行图来诊断查询性能问题,以及如何查看查询性能数据分析。

BigQuery 可提供强大的查询性能,但它也是一个复杂的分布式系统,其中包含许多可能会影响查询速度的内部和外部因素。SQL 语言的声明性也可以隐藏查询执行的复杂性。这意味着,如果查询的运行速度比预期慢或比之前的运行慢,则了解发生的情况可能存在一定的难度。

查询执行图提供了一个直观的界面,方便您检查查询性能详情。通过使用该界面,您可以按图形格式查看任何查询的查询计划信息,无论是正在运行还是已完成。

您还可以使用查询执行图来获取查询的性能数据分析。性能数据分析会尽力提供建议来帮助您提升查询性能。由于查询性能是多方面的,因此性能数据分析可能只提供整体查询性能的部分视图。

所需权限

如需使用查询执行图,您必须具有以下权限:

  • bigquery.jobs.get
  • bigquery.jobs.listAll

这些权限可通过以下 BigQuery 预定义 Identity and Access Management (IAM) 角色获得:

  • roles/bigquery.admin
  • roles/bigquery.resourceAdmin
  • roles/bigquery.resourceEditor
  • roles/bigquery.resourceViewer

查看查询性能数据分析

控制台

请按照以下步骤查看查询性能数据分析:

  1. 在 Google Cloud 控制台中打开 BigQuery 页面。

    转到 BigQuery 页面

  2. 编辑器中,点击个人历史记录项目历史记录

  3. 在作业列表中,找到您感兴趣的查询作业。点击 操作,然后选择在编辑器中打开查询

  4. 选择执行图标签页以查看图形表示的每个查询阶段:

    执行图中的图形查询计划。

    如需确定查询阶段是否存在性能数据分析,请查看查询阶段显示的图标。具有 信息图标的阶段存在性能数据分析。具有 对勾图标的阶段则不存在。

  5. 点击一个阶段可打开该阶段的详情窗格,您可以在其中查看以下信息:

    查询阶段详情。

  6. 可选:如果您要检查正在运行的查询,请点击 同步以更新执行图,从而反映该查询的当前状态。

    将执行图同步到正在运行的查询。

  7. 可选:如需在执行图上按阶段时长突出显示热门阶段,请点击按时长突出显示热门阶段

    按时长显示热门阶段。

  8. 可选:如需在执行图上按槽使用时间突出显示热门阶段,请点击按处理突出显示热门阶段

    按处理显示热门阶段。

  9. 可选:如需在执行图上添加 Shuffle 重新分布阶段,请点击显示 Shuffle 重新分布阶段

    按处理显示热门阶段。

    使用此选项可显示默认执行图中隐藏的重新分区和合并阶段。

    重新分区和合并阶段是在查询运行时引入的,用于改善处理查询的各个工作器之间的数据分布。由于这些阶段与查询文本无关,因此它们处于隐藏状态,以简化显示的查询计划。

对于存在性能回归问题的任何查询,性能数据分析也会显示在该查询的作业信息标签页上:

作业信息标签页。

SQL

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    
    SELECT
      `bigquery-public-data`.persistent_udfs.job_url(
        project_id || ':us.' || job_id) AS job_url,
      query_info.performance_insights
    FROM
      `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
    WHERE
      DATE(creation_time) >= CURRENT_DATE - 30 -- scan 30 days of query history
      AND job_type = 'QUERY'
      AND state = 'DONE'
      AND error_result IS NULL
      AND statement_type != 'SCRIPT'
      AND EXISTS ( -- Only include queries which had performance insights
        SELECT 1
        FROM UNNEST(
          query_info.performance_insights.stage_performance_standalone_insights
        )
        WHERE slot_contention OR insufficient_shuffle_quota
        UNION ALL
        SELECT 1
        FROM UNNEST(
          query_info.performance_insights.stage_performance_change_insights
        )
        WHERE input_data_change.records_read_diff_percentage IS NOT NULL
      );
    

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

API

您可以通过调用 jobs.list API 方法并检查返回的 JobStatistics2 信息,以非图形格式获取查询性能数据分析。

解读查询性能数据分析

本部分可让您详细了解性能数据分析的含义以及如何执行性能数据分析。

性能数据分析适用于两个受众群体:

  • 分析师:您在项目中运行查询。您想找出之前运行的查询速度意外变慢的原因,并想获得有关如何提高查询性能的提示。您拥有所需权限中所述的权限。

  • 数据湖或数据仓库管理员:您管理组织的 BigQuery 资源和预留。您拥有与 BigQuery Admin 角色关联的权限。

以下每个部分都提供了指导,说明您可以根据自己担任的这些角色中的哪些角色来利用您收到的性能数据分析。

槽争用

在运行查询时,BigQuery 会尝试将查询所需的工作分解为任务。任务是输入到阶段以及从阶段输出的单个数据切片。单个槽会获取任务并为阶段执行该数据切片。理想情况下,BigQuery 会并行执行这些任务,以实现高性能。当您的查询有许多任务准备开始执行,但 BigQuery 无法获得足够的可用槽来执行它们时,就会发生槽争用现象。

如果您是分析师,该怎么做?

按照减少查询中处理的数据中的指导信息,减少查询中处理的数据。

如果您是管理员,该怎么做?

通过执行以下操作,提高槽可用性或减少槽用量:

  • 如果您使用 BigQuery 的按需价格,则查询会使用共享的槽池。请考虑改为通过购买预留来改用基于容量的分析价格。通过预留,您可以为组织的查询预留专用槽。
  • 如果您使用的是 BigQuery 预留,请确保预留中有足够的槽分配给运行查询的项目。在以下情况下,预留可能没有足够的槽:

    • 还有其他作业正在使用预留槽。您可以使用管理员资源图表查看组织如何使用预留。
    • 预留没有足够的分配槽来足够快速地运行查询。您可以使用槽 Estimator 来估算您的预留应该有多大才能高效地处理您的查询任务。

    为此,您可以尝试以下解决方案之一:

    • 向该预留添加更多槽。
    • 创建其他预留并将其分配给运行查询的项目。
    • 将资源密集型查询分散到预留内的不同时间或者分散到不同的预留中。
  • 确保您所查询的表已聚簇。聚簇有助于确保 BigQuery 可以快速读取包含相关数据的列。

  • 确保您所查询的表已分区。对于未分区的表,BigQuery 会读取整个表。对表进行分区有助于确保您仅查询自己感兴趣的表的子集。

shuffle 配额不足

在运行查询之前,BigQuery 会将查询的逻辑分解为阶段。BigQuery 槽会为每个阶段执行任务。槽执行完阶段任务后,会将中间结果存储在 shuffle 中。查询中的后续阶段从 shuffle 读取数据以继续执行查询。如果需要写入 shuffle 的数据多于 shuffle 容量时,就会出现 shuffle 配额不足问题。

如果您是分析师,该怎么做?

与槽争用类似,减少查询处理的数据量可能会减少 shuffle 使用量。为此,请按照减少查询中处理的数据中的指导操作。

SQL 中的某些操作往往更广泛地使用 shuffle,尤其是 JOIN 操作GROUP BY 子句。在可能的情况下,减少这些操作的数据量可能会减少 shuffle 使用量。

如果您是管理员,该怎么做?

执行以下操作以减少 shuffle 配额争用现象:

  • 与槽争用类似,如果您使用 BigQuery 的按需价格,则查询会使用共享的槽池。请考虑改为通过购买预留来改用基于容量的分析价格。预留可以为您的项目查询提供专用槽和 shuffle 容量。
  • 如果您使用的是 BigQuery 预留,则槽具有专用的 Shuffle 容量。如果您的预留正在运行一些广泛使用 shuffle 的查询,可能会导致其他并行运行的查询无法获得足够的 shuffle 容量。您可以通过查询 INFORMATION_SCHEMA.JOBS_TIMELINE 视图中的 period_shuffle_ram_usage_ratio 列来确定哪些作业广泛使用 Shuffle 容量。

    为此,您可以尝试以下一种或多种解决方案:

    • 向该预留添加更多槽。
    • 创建其他预留并将其分配给运行查询的项目。
    • 将 shuffle 密集型查询分散到预留内的不同时间或者分散到不同的预留中。

数据输入缩放变化

此性能数据分析表明,您的查询读取给定输入表的数据比上次运行查询至少多 50%。 您可以使用表更改历史记录来查看查询中使用的任何表的大小是否在最近有所增加。

如果您是分析师,该怎么做?

按照减少查询中处理的数据中的指导信息,减少您在查询中处理的数据。

高基数联接

如果查询的联接两侧包含非唯一键,则输出表的大小可能远大于任一输入表的大小。此数据分析表明输出行与输入行的比率较高,并提供有关这些行计数的信息。

如果您是分析师,该怎么做?

检查联接条件,以确认输出表的大小会增加。避免使用交叉联接。如果必须使用交叉联接,请尝试使用 GROUP BY 子句预先聚合结果,或使用窗口函数。如需了解详情,请参阅在使用 JOIN 之前减少数据

分区偏差

如需针对此功能提供反馈或请求支持,请发送电子邮件至 bq-query-inspector-feedback@google.com

偏差数据分布可能会导致查询运行缓慢。执行查询时,BigQuery 会将数据拆分为小分区。您不能在槽之间共享分区。因此,如果数据分布不均匀,则某些分区会变得非常大,从而导致处理超大分区的槽崩溃。

JOIN 阶段会出现偏差。运行 JOIN 操作时,BigQuery 会将 JOIN 操作右侧的数据拆分为多个分区。如果分区太大,则系统会通过重新分区阶段重新平衡数据。如果偏差非常大,并且 BigQuery 无法进一步重新平衡,则系统会将分区偏差数据分析添加到“JOIN”阶段。此过程称为重新分区阶段。如果 BigQuery 检测到无法进一步拆分的任何大型分区,则会向 JOIN 阶段添加分区偏差数据分析。

如果您是分析师,该怎么做?

为避免分区偏差,请尽早过滤您的数据。如需详细了解如何避免分区偏差,请参阅过滤偏差数据

解读查询阶段信息

除了使用查询性能数据分析之外,您还可以在查看查询阶段详细信息时遵循以下准则,以确定查询是否存在问题:

  • 如果一个或多个阶段的等待时间(毫秒)值高于查询先前的运行:
    • 查看您是否有足够的来容纳您的工作负载。如果没有,请在运行资源密集型查询时进行负载均衡,使其不会相互竞争。
    • 如果等待时间(毫秒)值高于之前一个阶段的值,请查看它之前的阶段,看看是否引入了瓶颈。对查询中涉及的表的数据或架构进行重大更改等事件可能会影响查询性能。
  • 如果某个阶段的 Shuffle 输出字节数值高于查询先前的运行,或高于先前的阶段,请评估该阶段中处理的步骤,看看是否有任何步骤造成数据量意外增加。造成这种情况的一个常见原因是步骤处理 INNER JOIN 时,联接两端存在重复键。这可能会导致返回的数据量意外增加。
  • 使用执行图按时长和处理查看热门阶段。请考虑这些阶段生成的数据量,以及数据量是否与查询中引用的表大小相匹配。如果不匹配,请查看这些阶段中执行的步骤,看看是否有任何步骤可能产生意外的临时数据。

后续步骤