使用 Query Insights 检测查询性能问题

本页面介绍了如何使用查询数据分析信息中心检测和分析性能问题。

Query Insights 概览

Query Insights 可帮助您检测和诊断 Spanner 数据库的查询和 DML 语句性能问题。它支持直观的监控,并提供诊断信息,帮助您不再局限于检测,从而确定性能问题的根本原因。

Query Insights 指导您完成以下步骤,从而帮助您提高 Spanner 查询性能:

  1. 确认低效查询是否导致高 CPU 利用率。
  2. 确定可能存在问题的查询或标记。
  3. 分析查询或请求标记以确定问题

Query Insights 可用于单区域和多区域配置。

价格

Query Insights 不会产生额外费用。

数据保留

Query Insights 的数据保留期限最长为 30 天。对于总 CPU 利用率(每个查询或请求标记)图表,数据来自 SPANNER_SYS.QUERY_STATS_TOP_* 表,该表最长保留 30 天。如需了解详情,请参阅数据保留

准备工作

如需查看“Query Insights”页面,除了实例和数据库级别的 Cloud Monitoring 权限和 Spanner 权限外,您还需要满足以下条件:

  • 如果您是精细访问权限控制用户,则必须已被授予对 spanner_sys_reader 系统角色或其某个成员角色的访问权限。在数据库概览页面上选择一个角色,以便 Google Cloud 控制台会话继续拥有所需的权限。

  • 如果您不是精细的访问权限控制用户,则需要以下 Identity and Access Management (IAM) 权限

    • spanner.databases.beginReadOnlyTransaction
    • spanner.databases.select
    • spanner.sessions.create

如需了解详情,请参阅精细访问权限控制简介精细访问权限控制系统角色

Query Insights 信息中心

Query Insights 信息中心会根据您选择的数据库和时间范围显示查询负载。查询负载衡量的是所选时间范围内实例中所有查询的总 CPU 利用率。 信息中心提供了一系列过滤条件,可帮助您查看查询负载。

如需查看数据库的 Query Insights 信息中心,请执行以下操作:

  1. 选择左侧导航面板中的查询数据分析。系统会打开 Query Insights 信息中心。
  2. 数据库列表中选择一个数据库。信息中心会显示数据库的查询加载信息。

信息中心包含以下部分:

  1. 数据库列表:过滤特定数据库或所有数据库上的查询负载。
  2. 时间范围过滤条件:按时间范围(如小时、天或自定义范围)过滤查询负载。
  3. 总 CPU 利用率(所有查询)图表:显示所有查询的聚合负载。
  4. 总 CPU 利用率(每个查询或请求标记)图表:显示每个查询或请求标记的 CPU 利用率。
  5. TopN 查询和标记表格:显示按 CPU 利用率排序的热门查询和请求标记列表。请参阅找出可能存在问题的查询或标记

Query Insights 信息中心

确认低效查询是否导致高 CPU 利用率

总 CPU 利用率用于衡量所选数据库中执行的查询在一段时间内执行的工作量(以 CPU 秒为单位)。

所有查询的总 CPU 利用率

请查看图表以了解以下问题:

  • 哪个数据库遇到了负载?从数据库列表中选择不同的数据库,以查找负载最高的数据库。 如需确定哪个数据库的负载最高,您还可以在 Cloud 控制台中查看数据库的 CPU 利用率 - 总计图表。

    数据库负载

  • CPU 利用率是否较高?图表是否随着时间推移或上升?如果 CPU 利用率不高,则表示问题不在于您的查询。

  • CPU 利用率保持较高的时间有多长?流量是最近猛增,还是在一段时间内一直保持着高涨?使用范围选择器选择不同的时间段,以了解问题持续了多长时间。放大以查看观察到查询负载峰值的时间窗口。缩小以查看长达一周的时间轴。

如果您在图表中看到与整体实例 CPU 使用率对应的峰值或海拔高度,则很可能是由于一个或多个开销很高的查询。接下来,您可以通过确定可能存在问题的查询或请求标记,更深入地了解调试过程。

找出可能存在问题的查询或请求标记

要识别可能存在问题的查询或请求标记,请查看“排名前 N 的查询”部分:

排名前 N 的查询

我们可以看到,使用 FPRINT 6815864236081503267 的查询 CPU 利用率较高,可能会有问题。

排名靠前的 N 个查询表概述了在所选时间范围内使用最多 CPU 的查询(按从高到低排序)。TopN 的查询数量上限为 100。

对于这些图表,我们从 TopN 的查询统计信息表中提取数据,该表具有三种不同的粒度:1 分钟、10 分钟和 1 小时。图表中每个数据点的值表示一分钟内的平均值。

建议的最佳做法是为 SQL 查询添加标记。查询标记可帮助您在更高级别的构造(例如业务逻辑或微服务)中发现问题。

排名前 N 的查询表格

下表显示了以下属性:

  • FPRINT:请求标记的哈希(如果存在);否则,为查询的哈希。
  • 查询或请求标记:如果查询具有关联的标记,则会显示请求标记。具有相同标记字符串的多个查询的统计信息会分组到一行中,并且 REQUEST_TAG 值与标记字符串匹配。如需详细了解如何使用请求标记,请参阅使用请求代码和交易代码进行问题排查

    如果查询没有关联的标记,则会显示 SQL 查询,并截断至约 64KB。对于批量 DML,SQL 语句被展平为一行并使用英文分号分隔符串联起来。在截断之前,系统会对连续相同的 SQL 文本进行去重。

  • 查询类型:指示查询是 PARTITIONED_QUERY 还是 QUERYPARTITIONED_QUERY 是包含从 分区查询 API 中获取的 partitionToken 的查询。所有其他查询和 DML 语句都由 QUERY 查询类型表示。

  • CPU 利用率:查询的 CPU 资源消耗量,以该时间间隔内在数据库上运行的所有查询使用的总 CPU 资源的百分比表示,显示在范围为 0 到 100 的水平条上。

  • CPU (%):查询的 CPU 资源消耗量,以该时间间隔内在数据库上运行的所有查询使用的 CPU 资源占总 CPU 资源的百分比表示。

  • 执行计数:Spanner 在时间间隔内看到查询的次数。

  • 平均延迟时间(毫秒):数据库中每次查询执行的平均时间长度(以微秒为单位)。该平均值不包括结果集的编码和传输时间以及开销。

  • 扫描的平均行数:查询扫描的平均行数,不包括已删除的值。

  • 返回的平均行数:查询返回的平均行数。

  • 返回的字节数:查询返回的数据字节数(不包括传输编码开销)。

图表之间可能存在的差异

您可能会注意到,总 CPU 利用率(所有查询)图表与总 CPU 利用率(每个查询或请求标记)图表之间存在一些差异。以下两种情况可能会导致这种情况:

  • 不同的数据来源:Cloud Monitoring 数据通常更准确,该数据为“总 CPU 利用率(所有查询)”图表提供数据,因为它每分钟推送一次,保留期限为 45 天。另一方面,馈送“总 CPU 利用率(按查询或请求标记)”图表的系统表数据可能是在 10 分钟(或 1 小时)内求出的平均值,在这种情况下,我们可能会丢失在“总 CPU 利用率(所有查询)”图表中看到的高粒度数据。

  • 不同的汇总期:两个图表的汇总期不同。例如,在检查 6 小时之前的事件时,我们会查询 SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE 表。在本例中,10:01 发生的事件将在 10 分钟内进行汇总,并且将存在于与 10:10 时间戳对应的系统表中。

以下屏幕截图展示了这种差异的示例。

图表之间的差异

分析特定查询或请求标记

如需确定某个查询或请求标记是否是问题的根本原因,请点击看起来其负载最高或所需时间比其他标记更长的查询或请求标记。您可以一次选择多个查询和请求代码。

您可以在图表中按住鼠标指针以跨时间轴执行查询,以了解其 CPU 利用率(以秒为单位)。

通过查看以下内容来缩小问题范围:

  • 负载高的时间有多长?只是现在高吗?还是长时间位于高负载?更改时间范围以找出查询开始表现不佳的日期和时间。
  • CPU 利用率是否出现峰值?您可以更改时间范围,以研究查询的历史 CPU 利用率。
  • 资源消耗是多少?它与其他查询有何关系? 查看表格,并将其他查询的数据与所选查询进行比较。 有很大区别吗?

如需确认所选查询是否造成高 CPU 利用率,您可以深入查看特定查询形状(或请求标记)的详细信息,并在“查询详细信息”页面上进一步分析。

查看“查询详细信息”页面

如需以图形的形式查看特定查询形状或请求标记的详细信息,请点击与查询或请求标记关联的 FPRINT。此时将打开“查询详细信息”页面。

查询详情页面

“查询详细信息”页面会显示以下信息:

  1. 查询详情文本:SQL 查询文本,截断为约 64KB。 具有相同代码字符串的多个查询的统计信息会分组到一行中,并且 REQUEST_TAG 与该代码字符串匹配。此字段中只会显示其中一个查询的文本。对于批量 DML,一组 SQL 语句会展平为一行,并使用英文分号分隔符串联。在截断之前,系统会删除连续相同的 SQL 文本的重复信息。
  2. 以下字段的值:
    • 执行计数:Spanner 在时间间隔内看到查询的次数。
    • 平均 CPU(毫秒):查询实例在特定时间间隔内 CPU 资源的平均 CPU 资源消耗量(以毫秒为单位)。
    • 平均延迟时间(毫秒):数据库中每个查询执行的平均时长(以毫秒为单位)。该平均值不包括结果集的编码和传输时间以及开销。
    • 返回的平均行数:查询返回的平均行数。
    • 扫描的平均行数:查询扫描的平均行数,不包括已删除的值。
    • 平均字节数:查询返回的数据字节数,不包括传输编码开销。
  3. 查询计划样本图:图表上的每个点都表示特定时间的抽样查询计划及其特定查询延迟时间。点击图表中的某个点即可查看查询计划,并直观呈现查询执行期间采取的步骤。 注意:如果查询具有从 SectionQuery API 和分区 DML 查询获取的 升级令牌,则不支持查询计划。
  4. 查询计划可视化工具:显示所选的抽样查询计划。图表上的每个节点(即卡片)都表示一个迭代器,该迭代器使用其输入中的行,并为父级生成行。您可以点击每个迭代器来查看展开的信息。
  5. 查询延迟时间图:显示所选查询在一段时间内的查询延迟时间值。以及平均延迟时间。
  6. CPU 利用率图表:显示一段时间内某个查询的 CPU 利用率(以百分比表示)。该图表还会显示平均 CPU 利用率。
  7. 执行计数/失败图表:显示特定时间段内某个查询的执行次数以及该查询执行失败的次数。
  8. 扫描的行数图:显示查询在一段时间内扫描的行数。
  9. 返回的行数图表:显示在一段时间内查询返回的行数。
  10. 时间范围过滤条件:按时间范围(例如小时、天或自定义范围)过滤查询详细信息。

对于这些图表,我们从 TopN 的查询统计信息表中提取数据,该表具有三种不同的粒度:1 分钟、10 分钟和 1 小时。图表中每个数据点的值表示一分钟间隔内的平均值。