

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 查询分析器
<a name="using-query-plan-profiler"></a>

本文档介绍了查询分析器，这是一种用于分析查询组件和性能的图形工具。

查询分析器是一项查询监控和故障排除特征，可通过 Amazon Redshift 控制台查看。这对于分析查询性能很有帮助。其主要用途是显示查询的可视化和图形运行顺序、执行计划和统计信息，使它们更易于理解和故障排除。查询分析器有助于分析以下类型的查询组件：
+ **子查询** - 子查询是查询工作的一部分。如果将一个查询拆分为多个子查询进行处理比将其作为单个大型查询来处理更为高效，则 Amazon Redshift 可能会拆分查询。在分析器中，您可以看到每个子查询的属性。子查询由流和其他子组件组成。

  查询分析器显示的子查询类型通常包括以下几种：
  + **临时表查询**：此子查询的文本以 `CREATE TEMP TABLE` 命令开头。此子查询会创建临时表，让其他子查询来处理。
  + **统计查询**：查询分析器在此子查询的开头添加以下注释来协助进行识别：

    ```
    -- collect statistics of child query {{queryID}}
    ```

    此子查询收集 Amazon Redshift 查询引擎用于优化性能的信息。
**注意**  
查询分析器将用户提供的查询显示为 Amazon Redshift 运行的最终子查询。
+ **流** - 流是在可用计算节点切片上分组的分段的集合。每个子查询由一个或多个分段组成。在查询分析器中，您可以查看每个流的属性，例如其执行时间。通过浏览流列表，您可以快速发现性能瓶颈。
+ **分段** - 分段是单个过程可以运行的多个步骤的组合。分段也是计算节点切片可执行的最小编译单元。切片是 Amazon Redshift 中并行处理的单元。流中的分段并行运行。查询分析器不会以图形方式显示分段，但您可以在步骤的详细信息窗格中访问该步骤的分段信息。
+ **步骤** - 每个分段都由一组步骤组成。步骤是查询中的一项工作。例如，步骤可以包括*哈希连接*或*扫描*，扫描会从表中读取记录。

有关流、分段和步骤的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的[查询计划和执行工作流](https://docs.aws.amazon.com/redshift/latest/dg/c-query-planning.html)。

查询探查器显示由 `SYS_QUERY_HISTORY`、`SYS_QUERY_DETAIL`、`SYS_QUERY_EXPLAIN` 和 `SYS_CHILD_QUERY_TEXT` 视图返回的信息。有关这些视图的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_HISTORY](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_HISTORY)、[SYS\_QUERY\_DETAIL](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_DETAIL.html)、[SYS\_QUERY\_EXPLAIN](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_EXPLAIN.html) 和 [SYS\_CHILD\_QUERY\_TEXT](https://docs.aws.amazon.com/redshift/latest/dg/SYS_CHILD_QUERY_TEXT.html)。

查询分析器仅显示最近在数据库上运行的查询的查询信息。如果之前没有可用的信息，则使用预先填充的缓存数据而不是直接针对数据库运行的查询将不会生成查询性能分析。这是因为 Amazon Redshift 不会为其生成查询计划。

## 使用查询探查器的先决条件
<a name="using-query-plan-profiler-prereqs"></a>

SYS 监控视图专为易于使用和降低复杂性而设计，并提供了一系列完整的指标来进行有效的监控和故障排除。无论集群的大小或活动如何，SYS 监控视图还可以保证过去七天的查询历史记录。用户只能看到他们运行的查询，而超级用户可以看到来自所有用户的查询。

您的 IAM 用户账户或角色需要权限，才能访问控制台的**查询和数据库监控**部分。本节介绍如何向用户账户或角色添加权限。

使用以下策略向 IAM 用户账户或角色添加最低权限：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "redshift:DescribeClusters",
                "redshift-serverless:ListNamespaces",
                "redshift-serverless:ListWorkgroups",
                "redshift-data:ExecuteStatement",
                "redshift-data:DescribeStatement",
                "redshift-data:GetStatementResult"
            ],
            "Resource": [
                "arn:aws:redshift-serverless:{{us-east-1}}:{{111122223333}}:*",
                "arn:aws:redshift:{{us-east-1}}:{{111122223333}}:*"
            ]
        }
    ]
}
```

------

**Topics**
+ [向角色授予查询监控权限](#using-query-plan-profiler-prereqs-role)
+ [向用户授予查询监控权限](#using-query-plan-profiler-prereqs-user)
+ [使用您的 IAM 身份的临时凭证](#using-query-plan-profiler-prereqs-temp-iam)

### 向角色授予查询监控权限
<a name="using-query-plan-profiler-prereqs-role"></a>

具有 `sys:monitor` 权限的角色的用户可以查看所有查询。具有 `sys:operator` 权限的角色的用户可以取消查询、分析查询历史记录和执行 vacuum 操作。

**授予角色查询监控权限**

1. 使用以下命令提供系统监控访问权限，其中 {{role-name}} 是您想要为其提供访问权限的角色的名称。

   ```
   grant role sys:monitor to "IAMR:{{role-name}}";
   ```

1. （可选）使用以下命令提供系统操作员访问权限，其中 {{role-name}} 是您想要为其提供访问权限的角色的名称。

   ```
   grant role sys:operator to "IAMR:{{role-name}}";
   ```

### 向用户授予查询监控权限
<a name="using-query-plan-profiler-prereqs-user"></a>

具有 `sys:monitor` 权限的用户可以查看所有查询。具有 `sys:operator` 权限的用户可以取消查询、分析查询历史记录和执行 vacuum 操作。

**授予用户查询监控权限**

1. 使用以下命令提供系统监控访问权限，其中 {{user-name}} 是您想要为其提供访问权限的用户的名称。

   ```
   grant role sys:monitor to "IAMR:{{user-name}}";
   ```

1. （可选）使用以下命令提供系统操作员访问权限，其中 {{-name}} 是您想要为其提供访问权限的用户的名称。

   ```
   grant role sys:operator to "IAMR:{{user-name}}";
   ```

### 使用您的 IAM 身份的临时凭证
<a name="using-query-plan-profiler-prereqs-temp-iam"></a>

仅在连接到集群时此选项才可用。使用此方法，查询探查器会将用户名映射到您的 IAM 身份并生成临时密码，以便使用您的 IAM 身份连接到数据库。必须允许使用此方法进行连接的用户对 `redshift:GetClusterCredentialsWithIAM` 拥有 IAM 权限。要防止用户使用此方法，请修改其 IAM 用户或角色以拒绝此权限。

## 在 Amazon Redshift 控制台中访问查询分析器来分析查询
<a name="using-query-plan-profiler-accessing"></a>

您可以访问 Amazon Redshift Serverless 或预置 Amazon Redshift 的查询分析器。有关详细信息，请参阅下面几节：

**Topics**
+ [在 Amazon Redshift 控制台中访问 Amazon Redshift Serverless 的查询分析器](#using-query-plan-profiler-accessing-serverless)
+ [在 Amazon Redshift 控制台中访问预置 Amazon Redshift 的查询分析器](#using-query-plan-profiler-accessing-provisioned)

### 在 Amazon Redshift 控制台中访问 Amazon Redshift Serverless 的查询分析器
<a name="using-query-plan-profiler-accessing-serverless"></a>

要访问 Amazon Redshift Serverless 的查询分析器，请执行以下操作：
+ 打开 Amazon Redshift Serverless 控制台。
+ 在导航窗格的**监控**下面，选择**查询和数据库监控**。
+ 选择一个工作组。
+ 选择**查询和数据库监控**。
+ 选择一个查询。
+ 在**查询详细信息**页面中选择**查询计划**选项卡。

如果查询计划可用，您将看到子查询列表。选择一个查询以在查询分析器中查看该查询。

### 在 Amazon Redshift 控制台中访问预置 Amazon Redshift 的查询分析器
<a name="using-query-plan-profiler-accessing-provisioned"></a>

要访问预置 Amazon Redshift 的查询分析器，请执行以下操作：
+ 打开 Amazon Redshift 预置集群控制面板。
+ 选择一个集群
+ 选择**查询监控**。
+ 连接到数据库
+ 选择**查询和数据库监控**。
+ 选择一个查询。

如果查询计划可用，您将看到子查询列表。选择一个查询以在查询分析器中查看该查询。

## 查询分析器用户界面
<a name="using-query-plan-profiler-ui"></a>

查询分析器使用以下页面来显示有关查询的信息：
+ **[查询详细信息页面](#using-query-plan-profiler-ui-query-details)**：此页面显示查询的统计信息和子查询。
+ **[子查询页面](#using-query-plan-profiler-ui-child-query)**：此页面显示子查询的统计信息、流和执行计划的直观表示。当您从**查询和数据库监控**页面的**子查询**列表中选择子查询时，控制台会显示此页面。

### 查询详细信息页面
<a name="using-query-plan-profiler-ui-query-details"></a>

![](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/metrics_qp_query_details.png)


查询详细信息页面包含下列组件：
+ **顶部窗格** - 页面顶部的窗格显示有关查询的详细信息，例如状态和类型。若要详细了解顶部窗格所示信息的来源，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_HISTORY](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_HISTORY.html)。
+ **SQL 选项卡** - 底部面板的这个选项卡显示了原始用户查询的 SQL 文本。
+ **“查询计划”选项卡** - 底部面板的这个选项卡显示了 Amazon Redshift 用来为用户查询准备数据和统计信息的子查询列表。默认情况下，**子查询**列表显示有关每个子查询的信息和汇总统计信息。若要详细了解此页面所示信息的来源，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_DETAIL](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_DETAIL.html)。

  您可以使用“首选项”菜单在**子查询**列表中添加或删除列。
+ **相关指标** - 底部面板的这个选项卡显示了查询的以下 CloudWatch 指标：
  + **已使用的 RPU 容量**（用于无服务器工作组）：查询使用的计算容量，用 Redshift 处理器（RPU）来衡量。有关更多信息，请参阅 [Amazon Redshift Serverless 的计算容量](serverless-capacity.md)。
  + **集群运行状况**、**CPU 利用率**、**已用存储容量**（对于预置集群）：状态和查询使用的系统资源。
  + **活动的数据库连接**：查询的 `DatabaseConnections` 指标。

  有关 CloudWatch 指标的更多信息，请参阅[Amazon Redshift 中的性能数据](metrics-listing.md)。

### 子查询页面
<a name="using-query-plan-profiler-ui-child-query"></a>

![](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/metrics_qp_child_query_plan.png)


子查询页面包含下列组件：
+ **子查询下拉列表** - 此控件显示每个子查询的序列名称和执行时间。您可以通过在此控件中选择其他子查询来导航到这些子查询。
+ **侧面板** - 此面板包含用于显示子查询流和子查询文本的选项卡。
+ **“子查询流”选项卡** - 顶部面板的这个选项卡显示以下信息：
  + **流** - 此窗格显示子查询中的流列表。此窗格显示有关 Amazon Redshift 用于优化查询的流的信息和汇总数据。有关此窗格的详细信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_DETAIL](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_DETAIL.html)。

    您可以使用“首选项”菜单在**流**面板中添加或删除列。您可以使用**流**窗格中的齿轮图标访问“首选项”菜单。
  + **“子查询”窗格** - 子查询中步骤的图形表示。有关**子查询**窗格的信息，请参阅下面的[“子查询”窗格](#using-query-plan-profiler-child-query-pane)。
+ **“子查询文本”选项卡** - 顶部面板的这个选项卡显示子查询的 SQL 代码。
+ **“子查询详细信息”窗格** - 右侧面板中的这个窗格显示有关子查询的详细信息。有关此窗格的详细信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_DETAIL](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_DETAIL.html)。
+ **“流详细信息”窗格** - 在**流**窗格中选择流时，**流详细信息**窗格会显示有关该流的信息。有关此面板的详细信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_DETAIL](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_DETAIL.html)。
+ **“步骤详细信息”窗格** - 在**流**窗格或**子查询计划**的图表中选择步骤时，**步骤详细信息**窗格将显示有关该步骤的信息。有关此窗格的详细信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的 [SYS\_QUERY\_DETAIL](https://docs.aws.amazon.com/redshift/latest/dg/SYS_QUERY_DETAIL.html)：

## “子查询”窗格
<a name="using-query-plan-profiler-child-query-pane"></a>

查询分析器在**子查询**窗格中显示子查询，以图形方式表示所选子查询中的步骤。

**子查询**窗格显示运行顺序和步骤之间的关系。例如，如果一个步骤将来自其他两个步骤的输出连接起来，则**子查询**窗格会将该步骤显示为一个树节点，有两个节点馈入其中：

![](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/metrics_qp_hashjoin.png)


默认情况下，**子查询**窗格不显示包含步骤的流。要显示 Amazon Redshift 用于对子查询中的步骤进行逻辑分区的流，请选择**查看流**。选择**查看流**时，**子查询**窗格会显示查询的流中包含的步骤。

**子查询**窗格不显示分段信息。要查看某个步骤的分段，请选择该步骤。然后，**步骤详细信息**窗格会显示该步骤的分段。

### 在“子查询”窗格中导航
<a name="using-query-plan-profiler-child-query-pane-navigation"></a>

在**子查询**窗格中，您可以选择步骤来查看有关这些步骤的详细信息。您还可以平移和缩放工作区，以便更好地可视化查询计划中的步骤。

您可以使用以下方法在**子查询**计划中选择节点、平移和缩放：
+ **使用鼠标** - 您可以选择节点，点击并拖动工作区进行平移，按住 **Ctrl**（Windows）或 **CMD**（Mac）和鼠标滚轮进行缩放。选择一个节点会使工作区缩放和平移，从而突出显示该节点。如果您在工作区中选择一个流，则该流将在**流**列表中突出显示。如果您在工作区中选择一个步骤，则**步骤详细信息**窗格会显示有关该步骤的信息。
+ **使用工作区左上角的缩放和适合控件** - 这些控件使您可以放大、缩小、缩放以适合整个工作区以及进入全屏模式。当您缩放以适合整个查询计划时，工作区会使查询计划在水平和垂直方向上居中。
+ **使用工作区右下角的小地图** - 您可以使用工作区左下角的小地图控件平移或缩放工作区。
+ **在**流**窗格中选择一个流** - 如果在**流**窗格中选择一个流，则工作区会平移和缩放以显示所选流，并在**流详细信息**窗格中显示有关该流的信息。
+ **在**流详细信息**窗格中选择一个步骤** - 如果在**流详细信息**窗格中选择一个步骤，则工作区会平移和缩放以显示所选步骤，并在**步骤详细信息**窗格中显示有关该步骤的信息。

**注意**  
当您在工作区或另一个窗格中选择一个步骤时，工作区会尝试缩放和平移，以使所选步骤更清晰。  
当您从工作区或另一个窗格选择一个流或步骤时，只有在工作区右上角的控件中选择了**平移和缩放**时，工作区才会缩放并平移到该流或步骤。通过从下拉菜单中选择相应的设置，您可以将此行为限制为平移和缩放、仅平移或不移动。  

![](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/metrics_qp_pan_zoom.png)


## 排查使用查询分析器进行查询的问题
<a name="using-query-plan-profiler-troubleshooting"></a>

如果要对查询进行故障排除，则可以选择子查询来确定哪个流占用最高的**总查询时间百分比**。这是一种快速方法，可确定应进一步分析查询的哪一部分。

在知道哪个子查询花费的时间最多之后，请查看其步骤，以了解哪个联接或扫描可能导致性能降低。