

 Amazon Redshift는 패치 198부터 새 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` 노드 아래의 필터 노드는 Redshift Spectrum 계층에서 반환되는 데이터에 기반한 Amazon Redshift에서의 조건자 처리를 나타냅니다.
+ `S3 HashAggregate` 노드는 절(`group by spectrum.sales.eventid`)에 의한 Redshift Spectrum 계층에서의 집계를 나타냅니다.

Redshift Spectrum 성능을 개선할 수 있는 방법은 다음과 같습니다.
+ Apache Parquet 형식의 데이터 파일을 사용합니다. Parquet은 데이터를 컬럼 형식으로 저장하므로 Redshift Spectrum이 스캔에서 불필요한 열을 제거할 수 있습니다. 데이터가 텍스트 파일 형식인 경우, Redshift Spectrum은 전체 파일을 스캔해야 합니다.
+ 병렬 처리에 최적화되도록 여러 파일을 사용합니다. 파일 크기를 64MB 이상으로 유지하십시오. 파일 크기를 비슷하게 유지해 데이터 크기 스큐를 피하십시오. 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가 데이터 카탈로그의 테이블에 대한 통계를 생성하고 나면 Amazon Redshift Spectrum은 자동으로 해당 통계를 사용하여 쿼리 계획을 최적화합니다. AWS Glue를 사용하여 열 수준 통계를 계산하는 방법에 대한 자세한 내용은 **AWS Glue 개발자 안내서의 [열 통계 작업](https://docs.aws.amazon.com/glue/latest/dg/column-statistics.html)을 참조하세요.