Compartir a través de


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 administra el sesgo de manera predeterminada mediante la ejecución adaptativa de consultas (AQE). Consulte 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 las que tienen combinaciones. Las combinaciones entre tablas grandes requieren datos de oscilación y la asimetría puede provocar un desequilibrio extremo del trabajo en el clúster. Es probable que la asimetría de datos afecte a una consulta si una consulta parece estar bloqueada finalizando muy pocas tareas (por ejemplo, las tres últimas tareas de 200). Para comprobar que la asimetría de datos afecta a una consulta:

  1. Haga clic en la fase que está bloqueada y compruebe que está realizando una combinación.
  2. Una vez que finalice la consulta, busque la fase que realiza una combinación y compruebe la distribución de la duración de la tarea.
  3. Ordene las tareas reduciendo la duración y compruebe las primeras tareas. Si una tarea tardó mucho más tiempo en completarse que las demás tareas, hay sesgo.

Para mejorar la asimetría, Delta Lake en Azure Databricks SQL acepta sugerencias de sesgo en las consultas. Con la información de una sugerencia de sesgo, Databricks Runtime puede crear un mejor plan de consulta, uno que no sufra la asimetría 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

Configuración de la sugerencia de sesgo con el nombre de relación, los nombres de columna y los valores de sesgo

También puede especificar valores de sesgo en la sugerencia. En función de la consulta y los datos, los valores de sesgo pueden conocerse (por ejemplo, porque nunca cambian) o pueden ser fáciles de averiguar. Al hacerlo, se reduce la sobrecarga de la optimización de la combinación de sesgo. 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