Otimizador baseado em custos

O Spark SQL pode utilizar um otimizador baseado em custos (CBO) para melhorar os planos de consulta. Isto é especialmente útil para consultas com múltiplas associações. Para que isto funcione, é fundamental recolher estatísticas de tabelas e colunas e mantê-las atualizadas.

Recolher estatísticas

Para obter o benefício total do CBO, é importante recolher estatísticas de colunas e estatísticas de tabelas. As estatísticas podem ser recolhidas com o comando ANALYZE TABLE.

Sugestão

Para manter as estatísticas atualizadas, execute ANALYZE TABLE depois de escrever na tabela.

Verificar planos de consulta

Existem várias formas de verificar o plano de consulta.

EXPLAIN comando

Para verificar se o plano utiliza estatísticas, utilize os comandos SQL

  • Databricks Runtime 7.x e superior: EXPLAIN

Se as estatísticas estiverem em falta, o plano de consulta poderá não ser o ideal.

== 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

A rowCount estatística é especialmente importante para consultas com múltiplas associações. Se rowCount estiver em falta, significa que não existem informações suficientes para a calcular (ou seja, algumas colunas necessárias não têm estatísticas).

IU do SQL do Spark

Utilize a página IU do SQL do Spark para ver o plano executado e a precisão das estatísticas.

Estimativa em falta estimativa

Uma linha como rows output: 2,451,005 est: N/A significa que este operador produz aproximadamente 2 M de linhas e não existem estatísticas disponíveis.

Boa estimativa

Uma linha como rows output: 2,451,005 est: 1616404 (1X) significa que este operador produz cerca de 2 M de linhas, enquanto a estimativa foi aproximada. 1,6 M e o fator de erro de estimativa foi 1.

Estimativa incorreta

Uma linha como rows output: 2,451,005 est: 2626656323 significa que este operador produz aproximadamente 2 M de linhas enquanto a estimativa era de 2B linhas, pelo que o fator de erro de estimativa foi 1000.

Desativar o Otimizador de Cost-Based

O CBO está ativado por predefinição. Desativa o CBO alterando o spark.sql.cbo.enabled sinalizador.

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