

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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 循序掃描 
+ S3 HashAggregate 
+ S3 查詢掃描
+ 循序掃描 PartitionInfo (分割區資訊)
+ 分割區循環 

以下範例顯示了將外部資料表與本地資料表連接的查詢的查詢計畫。請注意在 Amazon S3 上的資料執行的 S3 循序掃描和 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` 節點下的篩選條件節點指示了從 Redshift Spectrum 層傳回資料上方 Amazon Redshift 中的述詞處理。
+ `S3 HashAggregate` 節點表示了 Redshift Spectrum 層中的 group by 子句 (`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 欄層級統計資料。一旦 在 Data Catalog 中 AWS Glue 產生資料表的統計資料，Amazon Redshift Spectrum 會自動使用這些統計資料來最佳化查詢計劃。如需使用 運算資料欄層級統計資料的詳細資訊 AWS Glue，請參閱《 *AWS Glue 開發人員指南*》中的[使用資料欄統計資料](https://docs.aws.amazon.com/glue/latest/dg/column-statistics.html)。