Optimización de la combinación de sesgo mediante sugerencias de asimetría
Importante
Esta documentación se ha retirado y es posible que no se actualice. Los productos, servicios o tecnologías mencionados en este contenido ya no se admiten.
No se requieren sugerencias de combinación de distorsión. Databricks controla la asimetría de forma predeterminada mediante la ejecución de consultas adaptables (AQE). Consulta Ejecución de consultas adaptables.
Nota
spark.sql.adaptive.skewJoin.enabled
debe ser True
, que es la configuración predeterminada en Azure Databricks.
¿Qué es la asimetría de datos?
La asimetría de datos es una condición en la que los datos de una tabla se distribuyen de forma desigual entre las particiones del clúster. La asimetría de datos puede degradar gravemente el rendimiento de las consultas, especialmente aquellos con combinaciones. Las uniones entre tablas grandes requieren redistribuir los datos, y el sesgo puede provocar un desequilibrio extremo del trabajo en el clúster. Es probable que la desviación de datos afecte a una consulta si una consulta parece quedarse atascada terminando muy pocas tareas (por ejemplo, las 3 últimas tareas de 200). Para comprobar que la asimetría de datos afecta a una consulta:
- Haz clic en la fase que está bloqueada y comprueba que estás realizando una combinación.
- Una vez finalizada la consulta, busque la fase que realiza una combinación y compruebe la distribución de la duración de la tarea.
- Ordene las tareas disminuyendo la duración y compruebe las primeras tareas. Si una tarea tarda mucho más tiempo en completarse que las otras tareas, hay asimetría.
Para mejorar la asimetría, Delta Lake en Azure Databricks SQL acepta sugerencias de sesgo en las consultas. Con la información de una pista de sesgo, Databricks Runtime puede construir un plan de consulta mejor, uno que no sufra de sesgo de datos.
Configuración de la sugerencia de sesgo con el nombre de relación
Una sugerencia de sesgo debe contener al menos el nombre de la relación con sesgo. Una relación es una tabla, vista o subconsulta. Todas las combinaciones con esta relación usan la optimización de combinación sesgada.
-- table with skew
SELECT /*+ SKEW('orders') */
*
FROM orders, customers
WHERE c_custId = o_custId
-- subquery with skew
SELECT /*+ SKEW('C1') */
*
FROM (SELECT * FROM customers WHERE c_custId < 100) C1, orders
WHERE C1.c_custId = o_custId
Configuración de la sugerencia de sesgo con el nombre de relación y los nombres de columna
Puede haber varias combinaciones en una relación y solo algunas de ellas se verán afectadas por el sesgo. La optimización de combinación de sesgo tiene cierta sobrecarga, por lo que es mejor usarla únicamente cuando sea necesario. Para este fin, la sugerencia de sesgo acepta nombres de columna. Solo las combinaciones con estas columnas usan la optimización de combinación sesgada.
-- single column
SELECT /*+ SKEW('orders', 'o_custId') */
*
FROM orders, customers
WHERE o_custId = c_custId
-- multiple columns
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId')) */
*
FROM orders, customers
WHERE o_custId = c_custId AND o_storeRegionId = c_regionId
Configura la sugerencia de sesgo con el nombre de la relación, los nombres de las columnas y los valores de asimetría
También puedes especificar valores de sesgo en la sugerencia. En función de la consulta y los datos, es posible que se conozcan los valores de asimetría (por ejemplo, porque nunca cambian) o pueden ser fáciles de averiguar. Esto reduce la sobrecarga de la optimización de la combinación de asimetría. De lo contrario, Delta Lake los detecta automáticamente.
-- single column, single skew value
SELECT /*+ SKEW('orders', 'o_custId', 0) */
*
FROM orders, customers
WHERE o_custId = c_custId
-- single column, multiple skew values
SELECT /*+ SKEW('orders', 'o_custId', (0, 1, 2)) */
*
FROM orders, customers
WHERE o_custId = c_custId
-- multiple columns, multiple skew values
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId'), ((0, 1001), (1, 1002))) */
*
FROM orders, customers
WHERE o_custId = c_custId AND o_storeRegionId = c_regionId