Optimizador basado en costos
Spark SQL puede usar un optimizador basado en el costo (CBO) para mejorar los planes de consulta. Esto es especialmente útil para las consultas con varias combinaciones. Para que funcione, es fundamental recopilar estadísticas de tabla y columna y mantenerlas actualizadas.
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.
Use ANALYZE
Importante
La optimización predictiva con ANALYZE
está en versión preliminar pública. Incluye la colección de estadísticas inteligentes durante las escrituras. Use este formulario para registrarse en la versión preliminar pública.
La optimización predictiva ejecuta ANALYZE
automáticamente , un comando para recopilar estadísticas, en tablas administradas del catálogo de Unity. 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. Consulte ANALYZE TABLE.
Comprobación de los planes de consulta
Hay varias maneras de comprobar el plan de consulta.
Comando EXPLAIN
Para comprobar si el plan usa estadísticas, use comandos SQL.
- Databricks Runtime 7.x y versiones posteriores: EXPLAIN
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).
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.
Deshabilitación del optimizador basado en el costo
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)