

 从补丁 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/)。

# Amazon Redshift Spectrum 查询性能
<a name="c-spectrum-external-performance"></a>

本主题介绍如何提高 Redshift Spectrum 查询性能。

查看查询计划以了解已推至 Amazon Redshift Spectrum 层的步骤。

以下步骤与 Redshift Spectrum 查询相关：
+ S3 Seq Scan 
+ S3 HashAggregate 
+ S3 Query Scan
+ Seq Scan PartitionInfo
+ Partition Loop 

以下示例显示了针对将外部表与本地表联接的查询的查询计划。注意已针对 Amazon S3 上的数据运行的 S3 Seq Scan 和 S3 HashAggregate 步骤。

```
explain
select top 10 spectrum.sales.eventid, sum(spectrum.sales.pricepaid) 
from spectrum.sales, event
where spectrum.sales.eventid = event.eventid
and spectrum.sales.pricepaid > 30
group by spectrum.sales.eventid
order by 2 desc;
```

```
QUERY PLAN                                                                                                                                                                                
-----------------------------------------------------------------------------
XN Limit  (cost=1001055770628.63..1001055770628.65 rows=10 width=31)                                                                                                                      
  ->  XN Merge  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                               
        Merge Key: sum(sales.derived_col2)                                                                                                                                                
        ->  XN Network  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                       
              Send to leader                                                                                                                                                              
              ->  XN Sort  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                    
                    Sort Key: sum(sales.derived_col2)                                                                                                                                     
                    ->  XN HashAggregate  (cost=1055770620.49..1055770620.99 rows=200 width=31)                                                                                           
                          ->  XN Hash Join DS_BCAST_INNER  (cost=3119.97..1055769620.49 rows=200000 width=31)                                                                             
                                Hash Cond: ("outer".derived_col1 = "inner".eventid)                                                                                                       
                                ->  XN S3 Query Scan sales  (cost=3010.00..5010.50 rows=200000 width=31)                                                                                  
                                      ->  S3 HashAggregate  (cost=3010.00..3010.50 rows=200000 width=16)                                                                                  
                                            ->  S3 Seq Scan spectrum.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT  (cost=0.00..2150.00 rows=172000 width=16)
                                                  Filter: (pricepaid > 30.00)                                                                                                             
                                ->  XN Hash  (cost=87.98..87.98 rows=8798 width=4)                                                                                                        
                                      ->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=4)
```

注意查询计划中的以下元素：
+ `S3 Seq Scan` 节点显示筛选条件 `pricepaid > 30.00` 已在 Redshift Spectrum 层中处理。

  `XN S3 Query Scan` 节点下的筛选节点指示 Amazon Redshift 中基于从 Redshift Spectrum 层返回的数据的谓词处理。
+ `S3 HashAggregate` 节点指示 Redshift Spectrum 层中针对分组依据子句 (`group by spectrum.sales.eventid`) 的聚合。

以下是提高 Redshift Spectrum 性能的方式：
+ 使用 Apache Parquet 格式化数据文件。Parquet 以列格式存储数据，因此 Redshift Spectrum 可通过扫描消除不需要的列。当数据为文本文件格式时，Redshift Spectrum 需要扫描整个文件。
+ 使用多个文件以针对并行处理进行优化。让文件大小超过 64 MB。通过将文件保持在大致相同的大小来避免数据大小偏斜。有关 Apache Parquet 文件和配置建议的信息，请参阅《Apache Parquet 文档》**中的[文件格式：配置](https://parquet.apache.org/docs/file-format/configurations/)。
+ 在查询中尽可能使用最少的列。
+ 将您的大型事实数据表放入 Amazon S3 中并将常用的较小的维度表保存在本地 Amazon Redshift 数据库中。
+ 通过设置 TABLE PROPERTIES numRows 参数来更新外部表统计数据。使用 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 或 [ALTER TABLE](r_ALTER_TABLE.md) 设置 TABLE PROPERTIES numRows 参数以反映表中的行数。Amazon Redshift 不分析外部表来生成表统计数据，查询优化程序会使用这些统计数据来生成查询计划。如果没有为外部表设置表统计数据，则 Amazon Redshift 会生成查询执行计划。Amazon Redshift 是基于“外部表较大，本地表较小”的假设生成此计划。
+ Amazon Redshift 查询计划程序会将谓词和聚合尽可能推至 Redshift Spectrum 查询层。如果从 Amazon S3 返回了大量数据，则处理将受您的集群的资源的限制。Redshift Spectrum 将自动扩展以处理大型请求。因此，当您可以将处理推至 Redshift Spectrum 层时，您的整体性能就会提高。
+ 编写查询以使用有资格推至 Redshift Spectrum 层的筛选条件和聚合。

  下面是可推至 Redshift Spectrum 层的某些操作的示例：
  + GROUP BY 子句
  + 比较条件和模式匹配条件 (如 LIKE)。
  + 聚合函数 (如 COUNT、SUM、AVG、MIN 和 MAX)。
  + 字符串函数。

  无法推至 Redshift Spectrum 层的操作包括 DISTINCT 和 ORDER BY。
+ 使用分区限制扫描的数据。根据您最常用的查询谓词为您的数据分区，然后通过筛选分区列来减少分区。有关更多信息，请参阅 [对 Redshift Spectrum 外部表进行分区](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning)。

  查询 [SVL\$1S3PARTITION](r_SVL_S3PARTITION.md) 以查看分区和合格分区总计。
+  使用 AWS Glue 的统计数据生成器来计算 AWS Glue Data Catalog 表的列级统计数据。AWS Glue 为 Data Catalog 中的表生成统计数据后，Amazon Redshift Spectrum 会自动使用这些统计数据来优化查询计划。有关使用 AWS Glue 计算列级统计数据的更多信息，请参阅《AWS Glue 开发人员指南》**中的[使用列统计数据](https://docs.aws.amazon.com/glue/latest/dg/column-statistics.html)。