Amazon Redshift Spectrum 查询性能 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon Redshift Spectrum 查询性能

本主题介绍如何提高 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 文档》中的文件格式:配置

  • 在查询中尽可能使用最少的列。

  • 将您的大型事实数据表放入 Amazon S3 中并将常用的较小的维度表保存在本地 Amazon Redshift 数据库中。

  • 通过设置 TABLE PROPERTIES numRows 参数来更新外部表统计数据。使用 CREATE EXTERNAL TABLEALTER TABLE 设置 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 外部表进行分区

    查询 SVL_S3PARTITION 以查看分区和合格分区总计。

  • 使用 Amazon Glue 的统计数据生成器来计算 Amazon Glue Data Catalog 表的列级统计数据。Amazon Glue 为 Data Catalog 中的表生成统计数据后,Amazon Redshift Spectrum 会自动使用这些统计数据来优化查询计划。有关使用 Amazon Glue 计算列级统计数据的更多信息,请参阅《Amazon Glue 开发人员指南》中的使用列统计数据