Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Spark SQL utiliza un optimizador basado en costes (CBO) para elegir planes de consulta eficientes. La CBO utiliza estadísticas de tablas y columnas, como el tamaño de la tabla y la distribución de datos, para estimar el coste de planes alternativos y elegir el plan con el coste estimado más bajo. Esto importa especialmente para consultas con múltiples joins, donde un mal plan puede ser órdenes de magnitud más lento que uno bueno.
El CBO está habilitado por defecto, pero depende de las estadísticas. Si faltan estadísticas o son obsoletas, la CBO podría elegir un orden o estrategia de unión ineficiente. Recopila estadísticas de tablas y columnas y mantenlas actualizadas. Ver Recopilar estadísticas.
Prácticas recomendadas
Para ayudar a la CBO a elegir planes de consulta eficientes, sigue estas prácticas:
- Recopila estadísticas para las tablas utilizadas en consultas multi-join. Si usas optimización predictiva en tablas gestionadas de Unity Catalog, se recopilan estadísticas por ti. Consulte Recoger estadísticas.
- Revisa los planes de consulta cuando una consulta multi-join es más lenta de lo esperado. Las estadísticas inexactas o faltantes son una causa común. Consulte Verificar planes de consulta.
- Eliminar estadísticas o desactivar la CBO solo para mitigar un problema específico de planificación que causan las estadísticas. Consulta Desactivar el optimizador basado en costes.
Recopilación de estadísticas
Para obtener todas las ventajas del CBO, es importante recopilar estadísticas de columna y estadísticas de tabla. Puede usar el ANALYZE TABLE comando para recopilar estadísticas manualmente.
Sugerencia
Para mantener actualizadas las estadísticas, ejecute ANALYZE TABLE después de escribir en la tabla.
Utilice ANALYZE
La optimización predictiva ejecuta automáticamente ANALYZE, un comando para recopilar estadísticas, en tablas administradas de Unity Catalog. Databricks recomienda habilitar la optimización predictiva para todas las tablas administradas de Unity Catalog para simplificar el mantenimiento de datos y reducir los costos de almacenamiento. Ver ANALYZE TABLE ... ESTADÍSTICAS DE PROCESO.
Puede quitar las estadísticas del optimizador para que el optimizador ya no se base en ellas, por ejemplo, para mitigar un problema de planificación causado por las estadísticas. Ver ANALYZE TABLE ... DROP STATISTICS.
Verificar planes de consulta
Hay varias maneras de comprobar el plan de consulta.
EXPLAIN comando
Para comprobar si el plan usa estadísticas, use el comando EXPLAINSQL .
Si faltan estadísticas, es posible que el plan de consulta no sea óptimo.
== Optimized Logical Plan ==
Aggregate [s_store_sk], [s_store_sk, count(1) AS count(1)L], Statistics(sizeInBytes=20.0 B, rowCount=1, hints=none)
+- Project [s_store_sk], Statistics(sizeInBytes=18.5 MB, rowCount=1.62E+6, hints=none)
+- Join Inner, (d_date_sk = ss_sold_date_sk), Statistics(sizeInBytes=30.8 MB, rowCount=1.62E+6, hints=none)
:- Project [ss_sold_date_sk, s_store_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: +- Join Inner, (s_store_sk = ss_store_sk), Statistics(sizeInBytes=48.9 GB, rowCount=2.63E+9, hints=none)
: :- Project [ss_store_sk, ss_sold_date_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: : +- Filter (isnotnull(ss_store_sk) && isnotnull(ss_sold_date_sk)), Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: : +- Relation[ss_store_sk,ss_sold_date_sk] parquet, Statistics(sizeInBytes=134.6 GB, rowCount=2.88E+9, hints=none)
: +- Project [s_store_sk], Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
: +- Filter isnotnull(s_store_sk), Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
: +- Relation[s_store_sk] parquet, Statistics(sizeInBytes=88.0 KB, rowCount=1.00E+3, hints=none)
+- Project [d_date_sk], Statistics(sizeInBytes=12.0 B, rowCount=1, hints=none)
+- Filter ((((isnotnull(d_year) && isnotnull(d_date)) && (d_year = 2000)) && (d_date = 2000-12-31)) && isnotnull(d_date_sk)), Statistics(sizeInBytes=38.0 B, rowCount=1, hints=none)
+- Relation[d_date_sk,d_date,d_year] parquet, Statistics(sizeInBytes=1786.7 KB, rowCount=7.30E+4, hints=none)
Importante
La estadística rowCount es especialmente importante para las consultas con varias combinaciones. Si falta rowCount, significa que no hay suficiente información para calcularla (es decir, algunas columnas necesarias no tienen estadísticas).
En Databricks Runtime 16.0 y superiores, la salida del EXPLAIN comando lista las tablas referenciadas que tienen estadísticas faltantes, parciales y completas, por ejemplo:
== Optimizer Statistics (table names per statistics state) ==
missing = date_dim, store
partial =
full = store_sales
Corrective actions: consider running the following command on all tables with missing or partial statistics
ANALYZE TABLE <table-name> COMPUTE STATISTICS FOR ALL COLUMNS
Interfaz de usuario de Spark SQL
Use la página de la interfaz de usuario de Spark SQL para ver el plan ejecutado y la precisión de las estadísticas.
Una línea del tipo rows output: 2,451,005 est: N/A significa que este operador genera aproximadamente 2 millones de filas y no había estadísticas disponibles.
Una línea del tipo rows output: 2,451,005 est: 1616404 (1X) significa que este operador genera aproximadamente 2 millones de filas, mientras que la estimación era aproximadamente de 1,6 millones y el factor de error de estimación fue de 1.
Una línea del tipo rows output: 2,451,005 est: 2626656323 significa que este operador genera aproximadamente 2 millones de filas mientras que la estimación era de 2 billones filas, por lo que el factor de error de estimación fue de 1000.
Desactiva el optimizador basado en costes
CBO está habilitado de manera predeterminada. Para deshabilitar el CBO, cambie la marca spark.sql.cbo.enabled.
spark.conf.set("spark.sql.cbo.enabled", false)