

 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/)을 참조하세요.

# 구체화된 뷰를 사용하여 반정형 데이터를 SUPER 열로 분할
<a name="r_shred_super"></a>

Amazon Redshift에서는 구체화된 뷰를 사용하여 SUPER 열로 데이터를 분할함으로써 쿼리 성능을 개선할 수 있습니다. 파쇄는 반정형 JSON 또는 XML 등 복잡한 데이터 유형을 더 작고 평평한 열로 세분화하는 프로세스를 말합니다. SUPER 열은 파쇄된 데이터를 빠르게 스캔하는 데 최적화된 특수한 형태의 열 스토리지입니다.

다음 섹션에서는 Amazon Redshift에서 구체화된 뷰를 사용하여 SUPER 열로 데이터를 파쇄하는 단계와 고려 사항을 설명합니다.

다음 예제에서는 결과 열이 여전히 SUPER 데이터 형식인 중첩 데이터를 나누는 구체화된 뷰를 보여줍니다.

```
SELECT c.c_name, o.o_orderstatus
FROM customer_orders_lineitem c, c.c_orders o;
```

다음 예제에서는 나뉜 데이터에서 기존의 Amazon Redshift 스칼라 열을 생성하는 구체화된 뷰를 보여줍니다.

```
SELECT c.c_name, c.c_orders[0].o_totalprice
FROM customer_orders_lineitem c;
```

단일 구체화된 뷰 super\$1mv를 생성하여 두 쿼리를 모두 가속화할 수 있습니다.

첫 번째 쿼리에 응답하려면 속성 o\$1orderstatus를 구체화해야 합니다. 중첩 탐색이나 중첩 해제를 포함하지 않기 때문에 속성 c\$1name을 생략할 수 있습니다. 구체화된 뷰에 customer\$1orders\$1lineitem의 속성 c\$1custkey를 포함해야 구체화된 뷰와 기본 테이블을 조인할 수 있습니다.

두 번째 쿼리에 응답하려면 속성 o\$1totalprice 및 c\$1orders의 배열 인덱스 o\$1idx도 구체화해야 합니다. 따라서 c\$1orders의 인덱스 0에 액세스할 수 있습니다.

```
CREATE MATERIALIZED VIEW super_mv distkey(c_custkey) sortkey(c_custkey) AS (
  SELECT c_custkey, o.o_orderstatus, o.o_totalprice, o_idx
  FROM customer_orders_lineitem c, c.c_orders o AT o_idx
);
```

구체화된 뷰 super\$1mv의 속성 o\$1orderstatus 및 o\$1totalprice는 SUPER입니다.

구체화된 뷰 super\$1mv는 기본 테이블 customer\$1orders\$1lineitem이 변경되면 점진적으로 새로 고쳐집니다.

```
REFRESH MATERIALIZED VIEW super_mv;
INFO: Materialized view super_mv was incrementally updated successfully.
```

첫 번째 PartiQL 쿼리를 일반 SQL 쿼리로 다시 작성하려면 다음과 같이 customer\$1orders\$1lineitem을 super\$1mv와 조인합니다.

```
SELECT c.c_name, v.o_orderstatus
FROM customer_orders_lineitem c 
JOIN super_mv v ON c.c_custkey = v.c_custkey;
```

마찬가지로 두 번째 PartiQL 쿼리를 다시 작성할 수 있습니다. 다음 예에서는 o\$1idx = 0에 대한 필터를 사용합니다.

```
SELECT c.c_name, v.o_totalprice
FROM customer_orders_lineitem c 
JOIN super_mv v ON c.c_custkey = v.c_custkey
WHERE v.o_idx = 0;
```

CREATE MATERIALIZED VIEW 명령에서 c\$1custkey를 배포 키로 지정하고 super\$1mv에 대한 정렬 키로 지정합니다. Amazon Redshift는 c\$1custkey가 customer\$1orders\$1lineitem의 배포 키이자 정렬 키라고 가정하고 효율적인 병합 조인을 수행합니다. 그렇지 않은 경우 다음과 같이 c\$1custkey를 customer\$1orders\$1lineitem의 정렬 키와 배포 키로 지정할 수 있습니다.

```
ALTER TABLE customer_orders_lineitem
ALTER DISTKEY c_custkey, ALTER SORTKEY (c_custkey);
```

EXPLAIN 문을 사용하여 Amazon Redshift가 재작성된 쿼리에 대해 병합 조인을 수행하는지 확인합니다.

```
EXPLAIN
      SELECT c.c_name, v.o_orderstatus
      FROM customer_orders_lineitem c JOIN super_mv v ON c.c_custkey = v.c_custkey;
      
      QUERY PLAN                                              
      ------------------------------------------------------------------------------------------------------
      XN Merge Join DS_DIST_NONE  (cost=0.00..34701.82 rows=1470776 width=27)
      Merge Cond: ("outer".c_custkey = "inner".c_custkey)
      ->  XN Seq Scan on mv_tbl__super_mv__0 derived_table2  (cost=0.00..14999.86 rows=1499986 width=13)
      ->  XN Seq Scan on customer_orders_lineitem c  (cost=0.00..999.96 rows=99996 width=30)
      (4 rows)
```