

# Administración de planes de consultas en Aurora PostgreSQL
<a name="AuroraPostgreSQL.Optimize.Start"></a>

Con la administración de planes de consultas activada para el clúster de base de datos de Aurora PostgreSQL, el optimizador genera y almacena los planes de ejecución de consultas para cualquier sentencia SQL que procese más de una vez. El optimizador siempre establece el estado del primer plan generado de una instrucción administrada en `Approved` y lo almacena en la vista `dba_plans`. 

Un conjunto de planes aprobados para una instrucción administrada se denomina *base de referencia del plan*. A medida que la aplicación se ejecuta, puede que el optimizador encuentre planes adicionales para las instrucciones administradas. El optimizador establece el estado de los planes adicionales capturados en `Unapproved`. 

Posteriormente, podrá decidir si los planes `Unapproved` rinden apropiadamente y cambiarlos a `Approved`, `Rejected` o `Preferred`. Para ello, utilice la función `apg_plan_mgmt.evolve_plan_baselines` o la función `apg_plan_mgmt.set_plan_status`. 

Cuando el optimizador genera un plan para una sentencia SQL, la administración de planes de consultas guarda el plan en la tabla `apg_plan_mgmt.plans`. Los usuarios de la base de datos a los que se les ha otorgado el rol de `apg_plan_mgmt`pueden ver los detalles del plan consultando la vista `apg_plan_mgmt.dba_plans`. Por ejemplo, la siguiente consulta muestra detalles de los planes que se encuentran actualmente en la vista para un clúster de base de datos de Aurora PostgreSQL que no es de producción.
+ `sql_hash`: identificador de la sentencia SQL que es el valor de hash del texto normalizado de la sentencia SQL.
+ `plan_hash`: identificador único del plan que es una combinación del `sql_hash` y un hash del plan.
+ `status`: estado del plan. El optimizador puede ejecutar un plan aprobado.
+ `enabled`: indica si el plan está listo para usarse (verdadero) o no (falso).
+ `plan_outline`: representación del plan que se utiliza para recrear el plan de ejecución real. Los operadores de la estructura de árbol se asignan a los operadores de la salida EXPLAIN.

La vista `apg_plan_mgmt.dba_plans` tiene muchas más columnas que contienen todos los detalles del plan, por ejemplo, cuándo se utilizó el plan por última vez. Para ver todos los detalles, consulte [Referencia de la vista apg\$1plan\$1mgmt.dba\$1plans para la edición compatible con Aurora PostgreSQL](AuroraPostgreSQL.Optimize.dba_plans_view_Reference.md). 

## Normalización y el hash SQL
<a name="AuroraPostgreSQL.Optimize.Start.hash-and-normalization"></a>

En la vista `apg_plan_mgmt.dba_plans`, puede identificar una instrucción administrada por su valor hash SQL. El hash SQL se calcula sobre una representación normalizada de la instrucción SQL que elimina algunas diferencias, como los valores literales. 

El proceso de *normalización* de cada instrucción SQL conserva el espacio y las mayúsculas, de modo que puede seguir leyendo y entendiendo la esencia de la instrucción SQL. La normalización elimina o reemplaza los siguientes elementos.
+ Comentarios del bloque principal
+ La palabra clave EXPLAIN y las opciones EXPLAIN y EXPLAIN ANALYZE
+ Espacios finales
+ Todos los literales

Por ejemplo, tomemos la siguiente instrucción.

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

La administración de planes de consultas estandariza esta instrucción del siguiente modo:

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

La normalización permite utilizar el mismo hash SQL para instrucciones SQL similares que pueden diferir únicamente en sus valores literales o de parámetro. En otras palabras, pueden existir varios planes para el mismo hash SQL y un plan diferente que resulte óptimo según diferentes condiciones.

**nota**  
Una sola instrucción SQL que se usa con diferentes esquemas tiene diferentes planes porque está vinculada al esquema específico en tiempo de ejecución. El planificador utiliza las estadísticas de enlace de esquemas para elegir el plan óptimo.

Para obtener más información acerca de cómo el optimizador elige un plan, consulte [Uso de los planes administrados de Aurora PostgreSQL](AuroraPostgreSQL.Optimize.UsePlans.md). En esa sección, puede aprender a usar `EXPLAIN` y `EXPLAIN ANALYZE` para previsualizar un plan antes de usarlo realmente. Para obtener más información, consulte [Análisis del plan elegido por el optimizador](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.AnalyzePlans). Para obtener una imagen que describa el proceso de elección de un plan, consulte [Cómo elige el optimizador qué plan ejecutar.](AuroraPostgreSQL.Optimize.UsePlans.md#AuroraPostgreSQL.Optimize.UsePlans.ChoosePlans). 