

 从补丁 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="c-query-planning"></a>

下图概要介绍查询计划和执行工作流程。

![\[领导节点的查询计划和执行工作流。\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/images/07-QueryPlanning.png)


查询计划和执行工作流程遵循以下步骤：

1. 领导节点接收查询并解析 SQL。

1. 分析程序生成初步查询树，后者是原始查询的逻辑表示。然后，Amazon Redshift 将该查询树输入到查询优化程序中。

1. 优化程序评估并在必要时重写查询以最大限度地提高查询的效率。此过程有时会导致创建多个相关查询来替换单个查询。

1. 优化程序会生成一个查询计划以最佳性能进行执行（如果上一步导致多个查询，则生成多个查询计划）。查询计划指定执行选项，如联接类型、联接顺序、聚合选项和数据分配要求。

   您可以使用 [EXPLAIN](r_EXPLAIN.md) 命令查看查询计划。查询计划是分析和优化复杂查询的基本工具。有关更多信息，请参阅 [创建和解释查询计划](c-the-query-plan.md)。

1. 执行引擎将查询计划转换为*步骤*、*分段*和*流*：  
**步骤**  
每个步骤都是查询执行过程中需要的单独操作。可以组合步骤以允许计算节点执行查询、联接或其他数据库操作。  
**Segment**  
可以通过单个进程完成的几个步骤的组合，也是由计算节点切片执行的最小编译单元。*切片*是 Amazon Redshift 中并行处理的单元。流中的分段并行运行。  
**流**  
要分配到可用计算节点切片上的分段的集合。

   执行引擎基于步骤、段和流生成编译后的代码。编译的代码运行速度比解释的代码快，并且使用的计算容量更少。然后，将此编译的代码广播到计算节点。
**注意**  
在对查询进行基准测试时，您应始终比较查询第二次执行的时间，因为第一次执行时间包括编译代码的开销。有关更多信息，请参阅 [影响查询性能的因素](c-query-performance.md)。

1. 计算节点切片并行运行查询分段。在该流程中，Amazon Redshift 利用优化的网络通信、内存和磁盘管理，将中间结果从一个查询计划步骤传递到下一个。这还有助于加快查询执行速度。

步骤 5 和 6 针对每个流执行一次。引擎为一个流创建可执行分段并将其发送到计算节点。当该流的分段完成时，引擎会生成下一个流的分段。通过这种方式，引擎可以分析先前流中发生的情况（例如，操作是否基于磁盘），以影响下一个流中分段的生成。

计算节点完成后，它们会将查询结果返回到领导节点以进行最终处理。领导节点将数据合并到单个结果集中，并解决任何需要的排序或聚合。然后，领导节点将结果返回至客户端。

**注意**  
如有必要，计算节点可能会在查询执行期间将某些数据返回到领导节点。例如，如果您有一个包含 LIMIT 子句的子查询，则在数据在集群间重新分配以进一步处理前会在领导节点上应用该限制。