Partilhar via


Otimizador baseado nos custos

O Spark SQL pode usar um otimizador baseado em custos (CBO) para melhorar os planos de consulta. Isso é especialmente útil para consultas com várias junções. Para que isso funcione, é fundamental coletar estatísticas table e column e mantê-las atualizadas.

Recolher estatísticas

Para get todos os benefícios do CBO, é importante recolher estatísticas column e estatísticas table. Você pode usar o ANALYZE TABLE comando para coletar estatísticas manualmente.

Gorjeta

Para manter as estatísticas up-toatualizadas, execute ANALYZE TABLE depois de escrever no table.

Utilizar o comando ANALYZE

Importante

Otimização preditiva com ANALYZE está em Visualização Pública. Inclui a recolha inteligente de estatísticas durante as gravações. Use este formulário para se inscrever no Visualização Pública.

Otimização preditiva executa automaticamente ANALYZE, um comando para recolher estatísticas, no Unity Catalog gerido tables. A Databricks recomenda habilitar a otimização preditiva para todos os tables gerenciados do Unity Catalog para simplificar a manutenção de dados e reduzir os custos de armazenamento. Ver ANALYZE TABLE.

Verificar planos de consulta

Há várias maneiras de verificar o plano de consulta.

Comando EXPLAIN

Para verificar se o plano usa estatísticas, use os comandos SQL

  • Databricks Runtime 7.x ou posterior: EXPLAIN

Se faltarem estatísticas, o plano de consulta pode 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 várias junções. Se faltar rowCount, significa que não há informação suficiente para o calcular (ou seja, alguns columns necessários não têm estatísticas).

Interface do usuário do Spark SQL

Use a página Spark SQL UI para ver o plano executado e a precisão das estatísticas.

Estimativa em falta

Uma linha tal significa rows output: 2,451,005 est: N/A que este operador produz aproximadamente 2 milhões de linhas e não havia estatísticas disponíveis.

Boa estimativa

Uma linha tal significa rows output: 2,451,005 est: 1616404 (1X) que este operador produz aproximadamente 2 milhões de linhas, enquanto a estimativa foi de aproximadamente 1,6 milhões 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 2M linhas enquanto a estimativa era de 2B linhas, portanto, o fator de erro de estimativa foi 1000.

Desative o otimizador baseado em custos

O CBO está habilitado por padrão. Você desativa o CBO alterando o spark.sql.cbo.enabled sinalizador.

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