使用 AlloyDB 的高级查询数据分析功能提升查询性能

本页面介绍了如何使用 AlloyDB 高级 Query Insights 功能近乎实时地检测和分析主实例和读取池实例的查询性能问题。如需大致了解 AlloyDB 的高级 Query Insights 功能,请参阅 AlloyDB 的高级 Query Insights 功能概览

如需了解如何使用标准查询数据分析,请参阅使用查询数据分析提升查询性能

您可以使用 Gemini Cloud Assist 来帮助您监控 AlloyDB 资源并排查相关问题。如需了解详情,请参阅在 Gemini 的协助下进行监控和排查问题

准备工作

如需访问查询数据分析信息中心,请在 Google Cloud 项目中启用对 AlloyDB for PostgreSQL 的访问权限

所需的角色

如需使用 AlloyDB 高级 Query Insights 功能,您需要拥有以下权限:

  • 如需访问 AlloyDB 的高级 Query Insights 功能,您需要拥有访问 AlloyDB Query Insights 信息中心的权限。
  • 如需修改 AlloyDB 高级 Query Insights 功能的设置,您需要拥有更新 AlloyDB 实例的权限。

如需获得这些权限,请让管理员向您授予以下角色之一:

  • 基本查看者 (roles/viewer)
  • Database Insights Viewer (roles/databaseinsights.viewer)

如需详细了解如何授予角色,请参阅管理访问权限

启用 AlloyDB 高级 Query Insights 功能

如需为 AlloyDB 实例启用高级 Query Insights 配置,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 点击启用修改设置

  5. 修改查询数据分析设置标签页中,选中启用 AlloyDB 高级查询数据分析功能复选框。

    这默认需要进行以下配置更改:

    • 选中等待事件分析活跃查询分析复选框。
    • 将查询长度从 4500B 增加到 100000B。
  6. 保存更改。这会重启 AlloyDB for PostgreSQL 实例。

gcloud

gcloud alpha alloydb instances update INSTANCE \
--cluster=CLUSTER \
--project=PROJECT \
--region=REGION \
--observability-config-enabled

替换以下内容:

  • INSTANCE:要更新的实例的 ID。
  • CLUSTER:实例集群的 ID。
  • PROJECT:集群项目的 ID。
  • REGION:集群所在的区域,例如 us-central1

--observability-config-enabled 标志用于启用对 AlloyDB 实例的数据收集和分析,以监控其性能和运行状况。如果您想停用高级 Query Insights,请使用 --no-observability-config-enabled

Terraform

如需使用 Terraform 在 AlloyDB 实例上启用高级 Query Insights,请在 observability_config 代码块中将 enabled 字段设置为 true

示例如下:

  observability_config {
    enabled = true
  ...
  }
  

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

REST v1

此示例会在您的 AlloyDB 实例上启用高级 Query Insights。如需查看此调用的完整参数列表,请参阅方法:projects.locations.clusters.instances.patch。如需了解高级 Query Insights 设置,请参阅修改高级 Query Insights 设置

在使用任何请求数据之前,请先进行以下替换:

  • CLUSTER_ID:您创建的集群的 ID。它必须以小写字母开头,可以包含小写字母、数字和连字符。
  • PROJECT_ID:您要将集群放置在其中的项目的 ID。
  • LOCATION_ID:集群区域的 ID。
  • INSTANCE_ID:您要创建的主实例的名称。

如需启用实例配置,请使用以下 PATCH 请求:

PATCH https://alloydb.googleapis.com/v1beta/{instance.name=projects/PROJECT_ID/locations/LOCATION_ID/clusters/CLUSTER_ID/instances/INSTANCE_ID?updateMask=observabilityConfig.enabled}

updateMask=observabilityConfig.enabled 查询参数会告知 API 更新 observabilityConfig 代码块中的 enabled 字段。

请求 JSON 正文如下所示:

{
 "observabilityConfig": {
   "enabled" : true,
 }
}

启用高级 Query Insights 后,您可以修改高级 Query Insights 设置。

修改高级功能设置

如需修改 AlloyDB 实例的高级 Query Insights 配置,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 点击修改设置,然后修改以下任一设置:

    • 等待事件分析:等待事件分析可帮助您识别和解决数据库中的性能问题。等待事件是会导致查询相关操作处理中出现延迟的组件。
    • 活跃查询分析:跟踪正在运行的查询。
    • 存储查询注释:通过查看与您调查的任何查询相关的注释(属于查询长度的一部分),了解查询上下文。无需额外的内存。如果您的注释包含敏感信息,请注意用户访问权限。
    • 启用索引顾问:在集群的“Query Insights”页面上显示索引创建建议。
    • 选择运行频率字段中,您可以定义建议的更新频率。
    • 存储客户端 IP 地址:启用此设置后,即可跟踪客户端 IP 地址并分析相应数据。
    • 存储应用标记:启用后,可了解哪些 API 和模型视图控制器路由正在发出请求,并对这些数据进行分组以对其运行指标。
    • 查询计划抽样:查询计划可直观呈现用于完成查询样本的操作。采样率决定着您的数据库中每分钟可以捕获的查询样本数量。采样率越高,需要的内存越多。
    • 查询长度字段中,您可以更改查询长度的默认限制,从 256 字节到 100 KB。查询长度越大,需要的内存就越多。更改查询长度需要重启实例。
  5. 保存更改。

gcloud

gcloud alpha alloydb instances update INSTANCE \
--cluster=CLUSTER \
--project=PROJECT \
--region=REGION \
--observability-config-preserve-comments \
--observability-config-track-wait-events \
--observability-config-max-query-string-length=QUERY_LENGTH \
--observability-config-record-application-tags \
--observability-config-query-plans-per-minute=QUERY_PLANS \
--observability-config-track-active-queries

替换以下内容:

  • INSTANCE:要更新的实例的 ID。
  • CLUSTER:实例集群的 ID。
  • PROJECT:集群项目的 ID。
  • REGION:集群所在的区域,例如 us-central1
  • QUERY_LENGTH:查询的长度,范围为 1024 到 100000 字节。默认查询长度为 10240 字节。更长的查询长度对于分析查询更有用,但也需要更多内存。更改查询长度需要重启实例。 您仍然可以为超出长度上限的查询添加标记。
  • QUERY_PLANS:每分钟要配置的查询计划数。默认情况下,实例上所有数据库每分钟最多捕获 20 个已执行的查询计划样本。将此值更改为 1 到 20 之间的数字。如需停用抽样,请输入 0。 提高采样率或许能为您带来更多数据点,但可能会降低性能。

如果需要,请使用以下可选的可观测性标志:

  • --observability-config-track-active-queries:启用活跃查询跟踪。 如果您想停用此功能,请使用 --no-observability-config-track-active-queries
  • --observability-config-record-application-tags:存储应用标记,以帮助您确定发出请求的 API 和模型视图控制器 (MVC) 路由,并对数据进行分组以对其运行指标。此选项要求您使用一组特定标记对查询进行注释。如果您不想存储应用标记,请使用 --no-observability-config-record-application-tags
  • --observability-config-preserve-comments:保留添加到 SQL 代码中的注释,以提供有关代码的信息,而不会影响代码的执行。如果您不想保留注释,请使用 --no-observability-config-preserve-comments
  • --observability-config-track-wait-events:启用等待每个等待事件类型的事件。如果您不想跟踪等待事件,请使用 --no-observability-config-track-wait-events

Terraform

如需使用 Terraform 在 AlloyDB 实例上配置高级查询数据分析,请使用 google_alloydb_instance 资源

下面给出了一个示例:

  observability_config {
    enabled = ENABLED_VALUE
    preserve_comments = PRESERVE_COMMENTS_VALUE
    track_wait_events = TRACK_WAIT_EVENTS_VALUE
    max_query_string_length = MAX_QUERY_STRING_LENGTH_VALUE
    record_application_tags = RECORD_APPLICATION_TAGS_VALUE
    query_plans_per_minute = QUERY_PLANS_PER_MINUTE_VALUE
    track_active_queries = TRACK_ACTIVE_QUERIES_VALUE
  }
  

替换以下内容:

  • ENABLED_VALUE:实例的可观测性功能状态。在您修改设置并根据需要指定其他标志时,请将其设置为 true
  • PRESERVE_COMMENTS_VALUE:保留查询字符串中的注释。默认值为 false
  • TRACK_WAIT_EVENTS_VALUE:记录实例在查询执行期间的等待事件。默认值为 true
  • MAX_QUERY_STRING_LENGTH_VALUE:查询字符串长度。默认值为 10240。介于 1024 和 100000 之间的任何整数均有效。
  • RECORD_APPLICATION_TAGS_VALUE:记录实例的应用标记。默认值为 true
  • QUERY_PLANS_PER_MINUTE_VALUE:Insights 每分钟捕获的查询执行计划数量(针对所有查询)。默认值为 20。介于 0 到 20 之间的任何整数均有效。
  • TRACK_ACTIVE_QUERIES_VALUE:跟踪正在运行的查询。默认值为 false

    如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

REST v1

此示例用于在 AlloyDB 实例上配置高级 Query Insights 设置。如需查看此调用的完整参数列表,请参阅方法:projects.locations.clusters.instances.patch

如需配置高级 Query Insights 设置,请将 enabled 字段设置为 true,并根据需要修改其他可选字段。如需查看此调用的完整字段列表,请参阅 ObservabilityInstanceConfig

在使用任何请求数据之前,请先进行以下替换:

  • CLUSTER_ID:您创建的集群的 ID。它必须以小写字母开头,可以包含小写字母、数字和连字符。
  • PROJECT_ID:您要将集群放置在其中的项目的 ID。
  • LOCATION_ID:集群区域的 ID。
  • INSTANCE_ID:您要创建的主实例的名称。

如需修改实例配置,请使用以下 PATCH 请求:

PATCH https://alloydb.googleapis.com/v1beta/{instance.name=projects/PROJECT_ID/locations/LOCATION_ID/clusters/CLUSTER_ID/instances/INSTANCE_ID?updateMask=observabilityConfig.enabled,observabilityConfig.preserveComments,observabilityConfig.trackWaitEvents,observabilityConfig.maxQueryStringLength,observabilityConfig.recordApplicationTags,observabilityConfig.queryPlansPerMinute,observabilityConfig.trackActiveQueries,observabilityConfig.trackClientAddress}

用于配置所有高级查询分析字段的请求 JSON 正文如下所示:

{
 "observabilityConfig": {
   "enabled" : true,
   "preserveComments": true,
   "trackWaitEvents": true,
   "maxQueryStringLength": 5000,
   "recordApplicationTags": true,
   "queryPlansPerMinute": 20,
   "trackActiveQueries": true,
 }
}

检测和诊断查询性能问题

您可以使用高级 Query Insights 来检测和诊断性能问题。查询数据分析信息中心会显示数据库负载,用于衡量所选数据库中的查询在一段时间内所执行的工作(以 CPU 秒为单位)。每个正在运行的查询都在使用或等待资源。数据库负载是在给定时间范围内完成的所有查询所花费的时间与实际用时之比。

查看已执行查询完成的工作量指标

数据库负载图表显示数据库中所有已执行查询所完成的工作量(以 CPU 秒为单位),按所选维度细分。数据库负载会根据您从图表下拉菜单中选择的分布数据进行划分。

您可以按以下任一维度细分数据库负载:

  • 查询
  • 等待事件类型
  • 等待事件
  • 数据库
  • 用户

如需查看数据库中已执行查询完成的工作,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 选择要显示数据的总执行时间,例如 1 小时或 6 小时,也可以选择自定义时间。

  6. 数据库负载(按执行时间)下拉菜单中,选择要调查的维度。根据您选择的维度,该图表会显示所选维度对整体数据库负载的贡献。例如,如果您从数据库负载图表的下拉菜单中选择等待事件维度,则数据库负载图表中会显示所选数据库和用户在所选时间范围内发生的所有等待事件的细分情况。

    数据库负载图表会显示所有九种等待事件类型以及 PostgreSQL 中支持的等待事件的数据。系统会根据等待事件的数量和类型,显示贡献最大的前 10 个等待事件和类型。如果等待事件超过 10 个,系统会显示前 9 个等待事件,其余等待事件则归入其他类别。此方法也适用于其他维度,例如“查询”“数据库”和“用户”。

查看数据库负载的主要影响因素

借助主要维度(按数据库负载)表格,您可以查看数据库负载图表中选定时间范围和维度对应的数据库负载的主要影响因素。根据您在主要维度(按数据库负载)表格中选择的维度,您可以找到所选时间窗口内的最高值。

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 选择要显示数据的总执行时间,例如 1 小时或 6 小时,也可以选择自定义时间。

  6. 主要维度(按数据库负载)表格中,您可以点击以下任一标签页:

    维度 说明
    查询 表格会按总执行时间显示热门标准化查询。对于每个查询,列中显示的数据如下所示:
    • 平均执行时间(毫秒)。执行查询的平均时间。
    • 总执行时间(毫秒)。特定查询的总执行时间。
    • 返回的行数。查询平均提取行数。
    • 调用次数。应用调用查询的次数。
    • 按图表维度划分的负载百分比。药丸图显示了特定查询的图表维度分布情况。
    等待事件类型 该表格会列出所选时间范围内发生的热门等待事件类型。
    • 平均等待时间(毫秒)。查询在特定等待事件类型中花费的平均时间。
    • 总等待时间(以毫秒为单位)。查询在特定等待事件类型中花费的总执行时间。
    • 等待事件类型计数。所选时间范围内发生特定等待事件类型的次数。
    • 按图表维度划分的负载百分比。药丸图显示了在数据库负载图表的下拉菜单中选择的图表维度在特定等待事件类型中的分布情况。
    等待事件 该表格会列出所选时间范围内发生的热门等待事件。
    • 平均等待时间(毫秒)。查询在特定等待事件中花费的平均时间。
    • 总等待时间(以毫秒为单位)。查询在特定等待事件中花费的总执行时间。
    • 等待事件数。在所选时间范围内发生特定等待事件的次数。
    • 按图表维度划分的负载百分比。药丸图显示了在“数据库负载”下拉菜单中选择的图表维度在特定等待事件中的分布情况。
    数据库 该表格会列出在所选时间范围内所有执行的查询中对负载产生影响的主要数据库。
    • 数据库中的平均时间(毫秒)。查询在特定数据库中花费的平均时间。
    • 在数据库中花费的总时间(毫秒)。查询在特定数据库中花费的总执行时间。
    • 按图表维度划分的负载百分比。药丸图显示了在数据库负载图表下拉菜单中选择的图表维度在特定数据库中的分布情况。
    用户 该表格会列出在所选时间范围内所有执行的查询中的热门用户。
    • Avg time spent in user (ms)。查询在特定用户中花费的平均时间。
    • Total time spent in user (ms)。查询在特定用户中花费的总执行时间。
    • 按图表维度划分的负载百分比。柱状图显示了在数据库负载图表的下拉菜单中选择的图表维度在特定用户中的分布情况。

查看查询执行时间

AlloyDB 的高级 Query Insights 功能会在主要维度(按数据库负载)表中显示对数据库负载贡献最大的前 10 个查询。热门查询是指在所选时间范围内对数据库负载影响最大的查询。后续查询的执行时间是执行时间最长的查询的百分比。

如需了解主要维度(按数据库负载)中参数的执行时间如何受到所选图表维度(查询、等待事件类型、等待事件、数据库和用户)不同值的影响,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 主要维度(按数据库负载)表格中查看负载百分比(按图表维度),了解表格中的某个参数如何受到数据库负载图表中参数的影响。

    例如,当您在数据库负载图表中选择所有查询,然后在主要维度(按数据库负载)表中点击查询标签页时,查询的负载百分比会显示在指定时间段内所选数据库中对数据库负载贡献最大的查询列表。

查看查询执行时间详情

您可以在更多详情中查看有关查询执行时间的详细信息,包括您在数据库负载图表和表格中选择的维度、每个等待事件的定义以及封装在其他类别中的数据。

更多详情还会显示查询详情屏幕中其他位置未显示的复杂信息详情。此信息包括每个等待事件的定义。

如需查看有关查询执行时间的详细信息,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 主要维度(按数据库负载)表格中,点击查询对应的更多详情

AlloyDB 的高级 Query Insights 功能会显示标准化查询($1、$2 等),以替换字面量常量值。例如:

UPDATE
  "demo_customer"
SET
  "customer_id" = $1::uuid,
  "name" = $2,
  "address" = $3,
  "rating" = $4,
  "balance" = $5,
  "current_city" = $6,
  "current_location" = $7
WHERE
  "demo_customer"."id" = $8

此常量的值会被忽略,因此高级查询洞见可以汇总类似查询并移除该常量可能显示的任何个人身份信息 (PII)。

确定规范化查询的数据库负载

如需显示所选规范化查询在一段时间内于所选数据库中执行的查询所花费的时间和资源用量(以 CPU 秒为单位),请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 数据库负载图表中,点击查询。为了计算数据库负载,数据库负载图表会使用在分钟边界处完成的标准化查询所花费的时间与实际用时之比。

数据库负载图表的顶部,系统会显示规范化查询的前 10 KB 字符,其中出于聚合和个人身份信息 (PII) 考虑,先移除了字面量。

为了帮助确定每种状态所花费的时间分布,AlloyDB 的高级 Query Insights 功能会将每个标准化查询负载分配到等待事件和等待事件类型中。

您可以使用延迟时间图表来研究查询延迟时间。延迟时间是指完成规范化查询所用的时间(实际用时)。并行查询的延迟时间是按实际用时衡量的,即使查询的数据库负载可能更高(由于使用了多个核心来运行查询的一部分)也是如此。

您可以按百分位过滤,以查看第 50、第 95 或第 99 百分位,从而检测不符合预期执行时间的查询。如需分析标准化查询的历史延迟时间,请更改时间窗口。

分析规范化查询

查询计划会为您细化呈现一个查询样本中的不同操作,以便您了解和分析规范化查询。

示例查询计划为与标准化查询相关的查询计划示例提供 EXPLAIN ANALYZE 视图。这些是执行的查询计划,提供查询计划中每项操作所用的活动时间明细。

如需查看示例查询计划,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 选择要显示数据的总执行时间,例如 1 小时或 6 小时,也可以选择自定义时间。

  6. 主要维度(按数据库负载)表格中,点击某个查询。

  7. 查询计划示例中,点击图表上的任意点即可查看相应查询的查询计划。

使用标记监控和排查应用性能问题

高级查询数据分析提供以应用为中心的监控功能,并简化了使用对象关系映射 (ORM) 构建的应用的性能诊断。查询标记可帮助您查找更高级别的结构(例如使用业务逻辑、微服务或一些其他结构)中的问题。您可以在应用中使用标记来帮助您执行以下操作:

  • 监控数据库性能。
  • 使用 Sqlcommenter 识别由应用代码导致的性能问题。
  • 分析数据库负载。
  • 查看每个标记的负载。

如需了解如何在“查询数据分析”中使用标记,请参阅使用“查询数据分析”提升查询性能

排查数据库层中的应用问题

高级查询洞见功能提供上下文相关的端到端跟踪视图,可帮助您了解特定请求在数据库层面的应用问题。上下文中的端到端应用跟踪记录可帮助您确定有问题的查询的来源,例如按模型、视图、控制器和路由确定来源。

启用 OpenTelemetry 后,span 信息会与 SQL 注释内的标记信息一起发送到数据库中。从应用到 Cloud Logging 的跟踪记录会与数据库查询计划跟踪记录相关联,以确定问题的来源。

如需查看上下文相关轨迹,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 在集群和实例列表中,点击一个实例。

  3. 点击 Query Insights

  4. 选择数据库和用户。

  5. 点击主要维度(按数据库负载)表格中的任意条目。

  6. 查询洞见详情页面中,点击端到端

您还可以使用 Cloud Trace 查看查询计划中每个步骤的端到端跟踪。如需访问 Cloud Trace,请选择运维 > Trace

常见问题解答

本部分解答了有关高级查询洞见功能的常见问题。

为什么查询字符串会被截断?

默认情况下,高级 Query Insights 会显示查询字符串中的 10 KB 内容。您可以将显示上限提高到 100KB。

为什么数据库负载图表中的 CPU 负载会高于核心线数上限?

CPU 负载会同时考虑运行时以及等待 Linux 调度器调度正在运行的服务器进程的时间,因此 CPU 负载可能会超出核心线数上限。

我可以使用标准 Query Insights 指标吗?

可以。标准查询分析会生成可通过 Stackdriver 访问的计数器。您可以使用 Cloud Monitoring API 和 Metrics Explorer 界面来获取这些指标。如需了解详情,请参阅Google Cloud 指标

查询字符串的长度上限是多少?

对于标准查询洞见插件,查询字符串长度上限为 4.5 KB 字符。对于高级查询洞见,默认字符串长度为 10 KB,长度上限为 100 KB。

我可以在次要集群中使用高级 Query Insights 功能吗?

您无法在具有次要实例的集群中启用高级 Query Insights。在集群中创建次要实例之前,您必须先在集群中的所有实例上停用高级 Query Insights。

后续步骤