

# Aurora PostgreSQL의 쿼리 계획 관리
<a name="AuroraPostgreSQL.Optimize.Start"></a>

Aurora PostgreSQL DB 클러스터에 쿼리 계획 관리를 활성화하면 최적화 프로그램이 두 번 이상 처리하는 모든 SQL 문에 대한 쿼리 실행 계획을 생성하고 저장합니다. 최적화 프로그램은 관리형 문에 대해 생성된 첫 번째 계획의 상태를 항상 `Approved`로 설정하고 `dba_plans` 보기에 저장합니다.

관리형 문에 대해 저장된 승인된 계획의 세트를 *계획 기준*이라고 합니다. 애플리케이션이 실행될 때 최적화 프로그램은 관리형 문에 대한 추가 계획을 생성할 수 있습니다. 최적화 프로그램은 캡처한 추가 계획을 `Unapproved` 상태로 설정합니다.

이후에 `Unapproved` 계획이 잘 작동하는지 판단하고 이 계획을 `Approved`, `Rejected` 또는 `Preferred`로 변경할 수 있습니다. 그러기 위해서는 `apg_plan_mgmt.evolve_plan_baselines` 함수 또는 `apg_plan_mgmt.set_plan_status` 함수를 사용합니다.

최적화 프로그램이 SQL 문에 대한 계획을 생성할 때 쿼리 계획 관리는 이 계획을 `apg_plan_mgmt.plans` 테이블에 저장합니다. `apg_plan_mgmt` 역할이 부여된 데이터베이스 사용자는 `apg_plan_mgmt.dba_plans` 보기를 쿼리하여 계획 세부 정보를 볼 수 있습니다. 예를 들어, 다음 쿼리는 비프로덕션 Aurora PostgreSQL DB 클러스터의 현재 보기에 있는 계획의 세부 정보를 나열합니다.
+ `sql_hash` - SQL 문의 식별자로, SQL 문이 정규화된 텍스트의 해시 값입니다.
+ `plan_hash` - 계획의 고유 식별자로, `sql_hash`와 계획의 해시를 조합한 값입니다.
+ `status` – 계획의 상태입니다. 최적화 프로그램은 승인된 계획을 실행할 수 있습니다.
+ `enabled` - 계획이 사용할 준비가 되었는지(true) 아니면 사용할 준비가 되지 않았는지(false)를 나타냅니다.
+ `plan_outline` - 실제 실행 계획을 다시 생성하는 데 사용되는 계획을 표현합니다. 트리 구조의 연산자는 EXPLAIN 출력의 연산자에 매핑됩니다.

이 `apg_plan_mgmt.dba_plans` 보기에는 계획의 모든 세부 정보(예: 계획이 마지막으로 사용된 날짜)가 포함된 더 많은 열이 있습니다. 자세한 내용은 [Aurora PostgreSQL 호환 에디션의 apg\$1plan\$1mgmt.dba\$1plans 뷰에 대한 참조](AuroraPostgreSQL.Optimize.dba_plans_view_Reference.md) 섹션을 참조하세요.

## 정규화 및 SQL 해시
<a name="AuroraPostgreSQL.Optimize.Start.hash-and-normalization"></a>

`apg_plan_mgmt.dba_plans` 보기에서 SQL 해시 값을 사용하여 관리형 문을 식별할 수 있습니다. SQL 해시는 차이(예: 리터럴 값)를 없앤 SQL 문의 정규화된 표현에서 계산됩니다.

각 SQL 문의 *정규화* 프로세스는 공백과 대/소문자를 보존하므로 SQL 문의 요점을 읽고 이해할 수 있습니다. 정규화는 다음 항목을 제거하거나 대체합니다.
+ 주요 블록 설명
+ EXPLAIN 키워드와 EXPLAIN 옵션 및 EXPLAIN ANALYZE
+ 후행 공백
+ 모든 리터럴

다음 문을 예로 들 수 있습니다.

```
/*Leading comment*/ EXPLAIN SELECT /* Query 1 */ * FROM t WHERE x > 7 AND y = 1; 
```

쿼리 계획 관리는 이 문을 다음과 같이 정규화합니다.

```
SELECT /* Query 1 */ * FROM t WHERE x > CONST AND y = CONST; 
```

정규화는 리터럴 또는 파라미터 값만 다를 수 있는 유사 SQL 문에 대해 동일한 SQL 해시를 사용할 수 있게 합니다. 즉, 동일한 SQL 해시에 대해 서로 다른 조건에서 최적 상태인 서로 다른 계획이 여러 개 있을 수 있습니다.

**참고**  
서로 다른 스키마와 함께 사용되는 단일 SQL 문은 런타임에 특정 스키마에 바인딩되므로 다른 계획을 사용합니다. 플래너는 스키마 바인딩에 대한 통계를 사용하여 최적의 계획을 선택합니다.

최적화 프로그램이 계획을 선택하는 방법에 대한 자세한 내용은 [Aurora PostgreSQL 관리형 계획 사용](AuroraPostgreSQL.Optimize.UsePlans.md) 섹션을 참조하세요. 이 섹션에서는 계획을 실제로 사용하기 전에 `EXPLAIN` 및 `EXPLAIN ANALYZE`를 사용하여 계획을 미리 보는 방법을 배울 수 있습니다. 자세한 내용은 [최적화 프로그램이 선택한 계획 분석](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.AnalyzePlans)을 참조하세요. 계획 선택 프로세스를 설명하는 이미지는 [최적화 프로그램에서 실행할 계획을 선택하는 방식.](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.ChoosePlans) 섹션을 참조하세요.