Optimizador basado en costos

Spark SQL puede usar un optimizador basado en costos (CBO) para mejorar los planes de consulta. Esto es especialmente útil para las consultas con varias combinaciones. Para que esto 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 Analizar tabla.

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.

El comando EXPLAIN

Para comprobar si el plan usa estadísticas, use SQL comandos

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 rowCount estadística es especialmente importante para las consultas con varias combinaciones. Si falta, significa que no hay suficiente información para rowCount calcularla (es decir, algunas columnas necesarias no tienen estadísticas).

Interfaz de usuario SQL Spark

Use la página SQL interfaz de usuario de Spark para ver el plan ejecutado y la precisión de las estadísticas.

Falta una estimación

Una línea como significa que este operador genera aproximadamente 2 millones de filas y rows output: 2,451,005 est: N/A no había estadísticas disponibles.

Buena estimación

Una línea como significa que este operador genera aproximadamente 2 millones de filas, mientras que la estimación era aprox. 1,6 millones y el factor de error de estimación rows output: 2,451,005 est: 1616404 (1X) era 1.

Estimación no estimada

Una línea como significa que este operador genera aproximadamente 2 millones de filas mientras que la estimación era de 2B filas, por lo que el factor de error de estimación era rows output: 2,451,005 est: 2626656323 1000.

Deshabilitar el Cost-Based optimizador de aplicaciones

El CBO está habilitado de forma predeterminada. Para deshabilitar el CBO, cambie la spark.sql.cbo.enabled marca .

spark.conf.set("spark.sql.cbo.enabled", false)