Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

提高 Amazon 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 步骤。

Copy
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;
Copy
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://awssampledbuswest2/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 性能的方式:

  • 使用 Parquet 格式化数据文件。Parquet 以列格式存储数据,因此 Redshift Spectrum 可通过扫描消除不需要的列。当数据为文本文件格式时,Redshift Spectrum 需要扫描整个文件。

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

  • 使用多个文件以针对并行处理进行优化。将您的文件大小保持在 100 MB 和 1 GB 之间。通过将文件保持在大致相同的大小来避免数据大小偏斜。

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

  • 通过设置 TABLE PROPERTIES numRows 参数来更新外部表统计数据。使用 CREATE EXTERNAL TABLEALTER TABLE 设置 TABLE PROPERTIES numRows 参数来反映表中的行数。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 以查看分区和合格分区总计。