

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon Redshift Spectrum 的最佳实践
<a name="best-practices-redshift-spectrum"></a>

本节概述使用 [Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/dg/c-using-spectrum.html) 的最佳实践。我们建议您遵循以下最佳实践，以在使用 Redshift Spectrum 时获得最佳性能：
+ 请注意，文件类型对 Redshift Spectrum 查询性能有显著影响。为了提高性能，请使用列式编码文件（例如 ORC 或 Parquet），并仅对非常小的维度表使用 CSV 格式。
+ 使用基于前缀的分区以利用分区修剪功能。这意味着使用与数据湖中的分区键关联的筛选器。
+ Redshift Spectrum 会自动扩展以处理大型请求，因此尽可能多地在 Redshift Spectrum 中完成操作（例如，谓词下推）。
+ 注意高频筛选列的分区文件。如果数据按一个或多个筛选列进行分区，Redshift Spectrum 可以利用分区修剪功能，跳过对不需要的分区和文件的扫描。常见做法是根据时间对数据进行分区。
+ 您可使用以下查询来检查分区的有效性以及 Redshift Spectrum 查询的效率。

  ```
  Select query,
             segment,
             max(assigned_partitions) as total_partitions,
             max(qualified_partitions) as qualified_partitions
  From svl_s3partition
  Where query=pg_last_query_id()
  Group by 1,2;
  ```

  上述查询将显示以下内容：
  + **total\$1part** itions — 识别的分区数量 AWS Glue Data Catalog
  + **qualified\$1partitions**：Redshift Spectrum 查询访问的 Amazon Simple Storage Service（Amazon S3）前缀数量
+ 您还可以查看 `SVL_S3QUERY_SUMMARY` 系统表，以了解分区的有效性以及 Redshift Spectrum 查询的效率。为此，请使用以下语句。

  ```
  Select *
  From svl_s3query_summary
  Where query=pg_last_query_id();
  ```

  除了显示分区修剪效率的文件外，上述查询还返回了更多信息，包括 `is_partitioned`、`s3_scanned_rows/bytes` 和 `s3_returned_rows/bytes` 值。

## Redshift Spectrum 中的谓词下推
<a name="predicate-pushdown"></a>

使用谓词下推可以避免消耗 Amazon Redshift 集群中的资源。您可以将许多 SQL 操作下推至 Redshift Spectrum 层。我们建议尽可能利用此功能。

记住以下内容：
+ 您可以完全在 Redshift Spectrum 层评估某些类型的 SQL 操作，包括以下各项：
  + `GROUP BY` 子句
  + 比较和模式匹配条件（例如，`LIKE`）
  + 聚合函数（例如，`COUNT`、`SUM`、`AVG`、`MIN` 和 `MAX`）
  + `regex_replace`、`to_upper`、`date_trunc` 和其他函数
+ 您无法将某些操作推送到 Redshift Spectrum 层，包括 `DISTINCT` 和 `ORDER BY`。如果可能，请仅在查询的顶层执行 `ORDER BY`，因为排序是在领导节点中完成的。
+ 检查您的查询 `EXPLAIN` 计划以验证谓词下推是否有效。要在 `EXPLAIN` 命令中查找 Redshift Spectrum 部分，请查找以下步骤：
  + S3 Seq Scan
  + S3 HashAggregate
  + S3 Query Scan
  + Seq Scan PartitionInfo
  + Partition Loop
+ 在查询中使用最少的列数。如果数据采用 Parquet 或 ORC 格式，Redshift Spectrum 可以排除一些要扫描的列。
+ 充分利用分区进行并行处理和分区消除，并尽可能将文件大小保持在至少 64 MB。
+ 如果您使用 `CREATE EXTERNAL TABLE` 或 `ALTER TABLE`，请设置 `TABLE PROPERTIES` `'numRows'='nnn'`。Amazon Redshift 不分析外部表来生成表统计数据，查询优化器会使用这些统计数据来生成查询计划。如果未设置统计信息，则 Amazon Redshift 假设外部表较大，本地表较小。

## Redshift Spectrum 的查询调优提示
<a name="query-tuning-spectrum"></a>

我们建议您在查询调优时牢记以下几点：
+ 您的 Amazon Redshift 集群可参与查询的 Redshift Spectrum 节点数量与集群中的切片数量相关。
+ 扩大集群的规模可以提升集群的本地计算配置文件、存储配置文件以及 Amazon S3 数据湖查询的查询能力。
+ Amazon Redshift 查询计划程序会将谓词和聚合尽可能推至 Redshift Spectrum 查询层。
+ 如果从 Amazon S3 返回了大量数据，则处理将受您的集群的资源的限制。
+ 由于 Redshift Spectrum 会自动扩展以处理大型请求，因此每当能够将处理推至 Redshift Spectrum 层时，整体性能都会提升。