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. Las estadísticas se pueden recopilar mediante el comando ANALYZE TABLE.

Sugerencia

Para mantener actualizadas las estadísticas, ejecute ANALYZE TABLE después de escribir en la tabla.

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.

Estimación que falta

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.

Estimación buena

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.

Estimación mala

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)