

# Aurora PostgreSQL Limitless Database에 대한 DML 제한 사항 및 기타 정보
<a name="limitless-reference.DML-limitations"></a>

다음 주제에서는 Aurora PostgreSQL Limitless Database의 DML 및 쿼리 처리 SQL 명령에 대한 제한 사항을 설명하거나 자세한 정보를 제공합니다.

**Topics**
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ [CLUSTER](#limitless-reference.DML-limitations.CLUSTER)
+ [EXPLAIN](#limitless-reference.DML-limitations.EXPLAIN)
+ [INSERT](#limitless-reference.DML-limitations.INSERT)
+ [UPDATE](#limitless-reference.DML-limitations.UPDATE)
+ [VACUUM](#limitless-reference.DML-limitations.VACUUM)

## ANALYZE
<a name="limitless-reference.DML-limitations.ANALYZE"></a>

`ANALYZE` 명령은 데이터베이스의 테이블 내용에 대한 통계를 수집합니다. 이후 쿼리 플래너는 이러한 통계를 사용하여 쿼리에 대한 가장 효율적인 실행 계획을 결정하는 데 도움을 줍니다. 자세한 내용은 PostgreSQL 설명서의 [ANALYZE](https://www.postgresql.org/docs/current/sql-analyze.html)를 참조하세요.

Aurora PostgreSQL Limitless Database에서 `ANALYZE` 명령은 실행 시 모든 라우터 및 샤드에 대한 테이블 통계를 수집합니다.

`ANALYZE` 실행 중 모든 라우터에 대한 통계 계산을 방지하기 위해 테이블 통계는 라우터 중 하나에 대해 계산된 다음 피어 라우터에 복사됩니다.

## CLUSTER
<a name="limitless-reference.DML-limitations.CLUSTER"></a>

`CLUSTER` 명령은 인덱스를 기반으로 테이블을 물리적으로 재정렬합니다. 인덱스가 테이블에 이미 정의되어 있어야 합니다. Aurora PostgreSQL Limitless Database에서 클러스터링은 각 샤드에 있는 인덱스의 일부와 같은 위치에 있습니다(로컬).

자세한 내용은 PostgreSQL 설명서의 [CLUSTER](https://www.postgresql.org/docs/current/sql-cluster.html)를 참조하세요.

## EXPLAIN
<a name="limitless-reference.DML-limitations.EXPLAIN"></a>

다음 파라미터를 사용하여 `EXPLAIN` 명령의 출력을 구성합니다.
+ `rds_aurora.limitless_explain_options` - `EXPLAIN` 출력에 포함할 항목입니다. 기본값은 `single_shard_optimization`입니다. 계획이 단일 샤드에 최적화되어 있는지가 표시되지만 샤드 계획은 포함되지 않습니다.

이 예시에서는 `EXPLAIN` 출력에 샤드의 계획이 표시되지 않습니다.

```
postgres_limitless=> EXPLAIN SELECT * FROM employees where id =25;

                      QUERY PLAN
------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
 Single Shard Optimized
(2 rows)
```

이제 `shard_plans` 및 `single_shard_optimization`을 포함하도록 `rds_aurora.limitless_explain_options`을 설정합니다. 라우터와 샤드 모두에서 문 실행 계획을 볼 수 있습니다. 또한 `enable_seqscan` 파라미터를 비활성화하여 인덱스 스캔이 샤드 계층에 사용되도록 합니다.

```
postgres_limitless=> SET rds_aurora.limitless_explain_options = shard_plans, single_shard_optimization;
SET

postgres_limitless=> SET enable_seqscan = OFF;
SET

postgres_limitless=> EXPLAIN SELECT * FROM employees WHERE id = 25;

                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
   Remote Plans from Shard postgres_s4:
         Index Scan using employees_ts00287_id_idx on employees_ts00287 employees_fs00003  (cost=0.14..8.16 rows=1 width=15)
           Index Cond: (id = 25)
 Single Shard Optimized
(5 rows)
```

`EXPLAIN` 명령에 대한 자세한 내용은 PostgreSQL 설명서의 [EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html)을 참조하세요.

## INSERT
<a name="limitless-reference.DML-limitations.INSERT"></a>

대부분의 `INSERT` 명령은 Aurora PostgreSQL Limitless Database에서 지원됩니다.

PostgreSQL에는 명시적 `UPSERT` 명령이 없지만 `INSERT ... ON CONFLICT` 문을 지원합니다.

충돌 작업에 하위 쿼리 또는 변경 가능한 함수가 있는 경우 `INSERT ... ON CONFLICT`는 지원되지 않습니다.

```
-- RANDOM is a mutable function.
INSERT INTO sharded_table VALUES (1, 100) ON CONFLICT (id) DO UPDATE SET other_id = RANDOM();

ERROR: Aurora Limitless Tables doesn't support pushdown-unsafe functions with DO UPDATE clauses.
```

`INSERT` 명령에 대한 자세한 내용은 PostgreSQL 설명서의 [INSERT](https://www.postgresql.org/docs/current/sql-insert.html)를 참조하세요.

## UPDATE
<a name="limitless-reference.DML-limitations.UPDATE"></a>

샤드 키 업데이트는 지원되지 않습니다. 예를 들어 `customer_id` 샤드 키가 포함된 `customers`라는 샤딩된 테이블이 있습니다. 다음 DML 문은 오류를 일으킵니다.

```
postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_id =1;
ERROR:  Shard key column update is not supported

postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_name='abc';
ERROR:  Shard key column update is not supported
```

샤드 키를 업데이트하려면 먼저 샤드 키를 사용하여 행에 `DELETE` 작업을 수행한 다음 업데이트된 샤드 키 값을 사용하여 `INSERT` 작업으로 새 행을 삽입해야 합니다.

`UPDATE` 명령에 대한 자세한 내용은 PostgreSQL 설명서의 [Updating data](https://www.postgresql.org/docs/current/dml-update.html)를 참조하세요.

## VACUUM
<a name="limitless-reference.DML-limitations.VACUUM"></a>

샤딩된 테이블과 참조 테이블 모두에 vacuum 작업을 수행할 수 있습니다. 다음 `VACUUM` 함수는 Aurora PostgreSQL Limitless Database에서 완전히 지원됩니다.
+ VACUUM
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ DISABLE\$1PAGE\$1SKIPPING
+ FREEZE
+ FULL
+ INDEX\$1CLEANUP
+ PARALLEL
+ PROCESS\$1TOAST
+ TRUNCATE
+ 상세 표시

Aurora PostgreSQL Limitless Database에서 `VACUUM`에는 다음과 같은 제한 사항이 있습니다.
+ [pg\$1visibility\$1map](https://www.postgresql.org/docs/current/pgvisibility.html) 확장은 지원되지 않습니다.
+ [pg\$1stat\$1all\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-INDEXES-VIEW) 뷰를 사용하여 미사용 인덱스를 확인하는 것은 지원되지 않습니다.
+ [pg\$1stat\$1user\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html), [pg\$1class](https://www.postgresql.org/docs/current/catalog-pg-class.html) 및 [pg\$1stats](https://www.postgresql.org/docs/current/view-pg-stats.html)에 대한 통합 뷰는 구현되지 않습니다.

`VACUUM` 명령에 대한 자세한 내용은 PostgreSQL 설명서의 [VACUUM](https://www.postgresql.org/docs/current/sql-vacuum.html)을 참조하세요. Aurora PostgreSQL Limitless Database에서 vacuum 작업이 작동하는 방법에 대한 자세한 내용은 [Vacuum 작업을 통한 스토리지 공간 회수](limitless-vacuum.md) 섹션을 참조하세요.