

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Prácticas recomendadas para diseñar consultas de Amazon Redshift
<a name="best-practices-designing-queries"></a>

En esta sección se brinda información general sobre las prácticas recomendadas para diseñar consultas. Le recomendamos que siga las prácticas recomendadas de esta sección para lograr un rendimiento y una eficacia óptimos en las consultas.

## Recomendación de evitar usar la instrucción SELECT \* FROM
<a name="select-from-statement"></a>

Le recomendamos que evite el uso de la instrucción `SELECT * FROM`. En su lugar, enumere siempre las columnas para su análisis. Esto reduce el tiempo de ejecución de las consultas y los costos de los análisis de las consultas de Amazon Redshift Spectrum.

**Ejemplo de lo que se debe evitar**

```
select * 
from sales;
```

**Ejemplo de práctica recomendada**

```
select sales_date, sales_amt
from sales;
```

## Identificación de los problemas con las consultas
<a name="query-issues"></a>

Le recomendamos que consulte la vista [STL\_ALERT\_EVENT\_LOG](https://docs.aws.amazon.com/redshift/latest/dg/r_STL_ALERT_EVENT_LOG.html) para identificar y corregir posibles problemas con la consulta.

## Obtención de información resumida sobre la consulta
<a name="summary-info"></a>

Le recomendamos que use las vistas [SVL\_QUERY\_SUMMARY](https://docs.aws.amazon.com/redshift/latest/dg/r_SVL_QUERY_SUMMARY.html) y [SVL\_QUERY\_REPORT](https://docs.aws.amazon.com/redshift/latest/dg/r_SVL_QUERY_REPORT.html) para obtener información resumida sobre las consultas. Puede utilizar esta información para optimizar sus consultas.

## Recomendación de evitar las combinaciones cruzadas
<a name="cross-joins"></a>

Le recomendamos que evite usar las combinaciones cruzadas a menos que sea absolutamente necesario. Si una condición de combinación, las combinaciones cruzadas son un producto cartesiano de dos tablas. Por lo general, las combinaciones cruzadas se ejecutan como combinaciones de bucles anidados (que son los tipos de combinación más lentos).

**Ejemplo de lo que se debe evitar**

```
select c.c_name, 
          n.n_name 
from tpch.customer c, 
        tpch.nation n;
```

**Ejemplo de práctica recomendada**

```
select c.c_name, 
           n.n_name 
from tpch.customer c, 
join tpch.nation n
  on n.n_nationkey = c.c_nationkey;
```

## Recomendación de evitar las funciones en los predicados de las consultas
<a name="functions-query-predicates"></a>

Le recomendamos que evite el uso de las funciones en los predicados de las consultas. El uso de funciones en los predicados de las consultas puede afectar negativamente al rendimiento, ya que las funciones suelen agregar una sobrecarga de procesamiento adicional a cada fila y suelen ralentizar la ejecución general de la consulta.

**Ejemplo de lo que se debe evitar**

```
select sum(o_totalprice)
from tpch.orders
where datepart(year, o_orderdate) = 1992;
```

**Ejemplo de práctica recomendada**

```
select sum(o_totalprice)
from tpch.orders
where o_orderdate between '1992-01-01' and '1992-12-31';
```

## Recomendación de evitar las conversiones de tipo innecesarias
<a name="cast-conversions"></a>

Le recomendamos que evite usar las conversiones de tipo innecesarias en las consultas, ya que la conversión de tipos de datos requiere tiempo y recursos y ralentiza la ejecución de las consultas.

**Ejemplo de lo que se debe evitar**

```
select sum(o_totalprice)
from tpch.orders
where o_ordertime::date = '1992-01-01';
```

**Ejemplo de práctica recomendada**

```
select sum(o_totalprice)
from tpch.orders
where o_ordertime between '1992-01-01 00:00:00' and '1992-12-31 23:59:59';
```

## Uso de expresiones CASE en las agregaciones complejas
<a name="case-expressions"></a>

Le recomendamos que utilice una [expresión CASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CASE_function.html) para realizar agregaciones complejas en lugar de seleccionar de la misma tabla varias veces.

**Ejemplo de lo que se debe evitar**

```
select sum(sales_amt) as us_sales
from sales
where country = 'US';

select sum(sales_amt) as ca_sales
from sales
where country = 'CA';
```

**Ejemplo de práctica recomendada**

```
select sum(case when country = 'US' then sales_amt end) as us_sales,
           sum(case when country = 'CA' then sales_amt end) as ca_sales
from sales;
```

## Uso de subconsultas
<a name="subqueries"></a>

Le recomendamos que utilice subconsultas en los casos donde una tabla en la consulta se utilice solamente para condiciones de predicado y la subconsulta devuelva una cantidad pequeña de filas (menos de 200).

**Ejemplo de lo que se debe evitar**

Si una subconsulta devuelve menos de 200 filas:

```
select sum(order_amt) as total_sales
from sales
where region_key IN
        (select region_key
         from regions
         where state = 'CA');
```

**Ejemplo de práctica recomendada**

Si una subconsulta devuelve 200 filas o más:

```
select sum(o.order_amt) as total_sales
from sales o
join regions r
  on r.region_key = o.region_key
  and r.state = 'CA';
```

## Uso de predicados
<a name="predicates"></a>

Le recomendamos que utilice predicados para restringir el conjunto de datos tanto como sea posible. En SQL, los predicados se utilizan para filtrar y restringir los datos que se devuelven en una consulta. Al especificar las condiciones en un predicado, puede especificar qué filas deben incluirse en los resultados de la consulta en función de las condiciones especificadas. Esto le permite recuperar solo los datos que le interesan y mejora la eficacia y precisión de las consultas. Para obtener más información, consulte [Condiciones](https://docs.aws.amazon.com/redshift/latest/dg/r_conditions.html) en la documentación de Amazon Redshift.

## Adición de predicados para filtrar tablas con combinaciones
<a name="filter-tables-joins"></a>

Le recomendamos que agregue predicados para filtrar tablas que participen en combinaciones, aun cuando se apliquen los mismos filtros. El uso de predicados para filtrar tablas con combinaciones en SQL puede mejorar el rendimiento de las consultas, ya que reduce la cantidad de datos que se deben procesar y el tamaño del conjunto de resultados intermedios. Al especificar las condiciones de la operación de combinación en la cláusula `WHERE`, el motor de ejecución de consultas puede eliminar las filas que no coincidan con las condiciones antes de combinarlas. En consecuencia, se reduce el tamaño del conjunto de resultados y se incrementa la velocidad de las consultas.

**Ejemplo de lo que se debe evitar**

```
select p.product_name, sum(o.order_amt)
from sales o
join product p
   on r.product_key = o.product_key
where o.order_date > '2022-01-01';
```

**Ejemplo de práctica recomendada**

```
select p.product_name, sum(o.order_amt)
from sales o
join product p
  on p.product_key = o.product_key
  and p.added_date > '2022-01-01'
where o.order_date > '2022-01-01';
```

## Uso de los operadores menos costosos para los predicados
<a name="least-expensive-operators"></a>

En el predicado, utilice los operadores menos costosos que pueda. Los operadores de [condiciones de comparación](https://docs.aws.amazon.com/redshift/latest/dg/r_comparison_condition.html) son preferibles a los operadores [LIKE](https://docs.aws.amazon.com/redshift/latest/dg/r_patternmatching_condition_like.html). Los operadores `LIKE` siguen siendo preferibles a los operadores [SIMILAR TO](https://docs.aws.amazon.com/redshift/latest/dg/pattern-matching-conditions-similar-to.html) o [POSIX](https://docs.aws.amazon.com/redshift/latest/dg/pattern-matching-conditions-posix.html).

## Uso de las claves de clasificación en las cláusulas GROUP BY
<a name="group-by-clauses"></a>

Utilice las claves de clasificación en la cláusula `GROUP BY` para que el planificador de consultas pueda utilizar la agrupación de manera más eficiente. Una consulta puede considerarse para la agregación en una fase cuando la lista `GROUP BY` tiene solamente columnas de clave de clasificación, una de las cuales es también la clave de distribución. Las columnas con clave de clasificación en la lista `GROUP BY` deben incluir la primera clave de clasificación y, luego, las demás claves de clasificación que desee usar en el orden de la clave de clasificación.

## Recomendación de aprovechar las vistas materializadas
<a name="materialized-views"></a>

Si es posible, reescriba la consulta sustituyendo el código complejo por una vista materializada, lo que mejorará considerablemente el rendimiento de la consulta. Para obtener más información, consulte [Creación de vistas materializadas en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-overview.html) en la documentación de Amazon Redshift.

## Precaución con las columnas de las cláusulas GROUP BY y ORDER BY
<a name="group-by-order-by"></a>

Si utiliza las cláusulas `GROUP BY` y `ORDER BY`, asegúrese de colocar las columnas en el mismo orden en ambas cláusulas `GROUP BY` y `ORDER BY`. `GROUP BY` requiere implícitamente que los datos estén ordenados. Si la cláusula `ORDER BY` es diferente, los datos se deben ordenar dos veces.

**Ejemplo de lo que se debe evitar**

```
select a, b, c, sum(d)
from a_table
group by b, c, a
order by a, b, c
```

**Ejemplo de práctica recomendada**

```
select a, b, c, sum(d)
from a_table
group by a, b, c
order by a, b, c
```