Pular para o conteúdo principal

Otimizador baseado em custos

O Spark SQL pode usar um otimizador baseado em custo (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 de tabelas e colunas e mantê-las atualizadas.

Colete estatísticas

Para obter todos os benefícios do CBO, é importante coletar estatísticas de colunas e estatísticas de tabela . O senhor pode usar o comando ANALYZE TABLE para coletar estatísticas manualmente.

dica

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

Uso ANALYZE

Otimização preditiva executando automaticamente ANALYZE, um comando para coletar estatísticas, em Unity Catalog gerenciar tabelas. Databricks recomenda habilitar a otimização preditiva para todas as tabelas gerenciais do Unity Catalog para simplificar a manutenção de dados e reduzir os custos de armazenamento. Consulte ANALYZE TABLE.

Verifique os planos de consulta

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

EXPLAIN{Comando

Para verificar se o plano usa estatísticas, use o comando SQL 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)
important

A estatística rowCount é especialmente importante para consultas com várias uniões. Se rowCount estiver ausente, isso significa que não há informações suficientes para calculá-lo (ou seja, algumas colunas necessárias não têm estatísticas).

Em Databricks Runtime 16.0 e acima, a saída do comando EXPLAIN lista as tabelas referenciadas que têm estatísticas ausentes, parciais e completas, como no exemplo de saída a seguir:

== Optimizer Statistics (table names per statistics state) ==
missing = date_dim, store
partial =
full = store_sales
Corrective actions: consider running the following command on all tables with missing or partial statistics
ANALYZE TABLE <table-name> COMPUTE STATISTICS FOR ALL COLUMNS

UI do Spark SQL

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

Estimativa ausente

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

Boa estimativa

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

Estimativa ruim

Uma linha como rows output: 2,451,005 est: 2626656323 significa que esse operador produz aproximadamente 2 milhões de linhas, enquanto a estimativa era de 2 bilhões de linhas, portanto, o fator de erro de estimativa foi de 1000.

Desative o otimizador baseado em custos

A CBO é habilitada pelo site default. Você desativa o CBO alterando o sinalizador spark.sql.cbo.enabled.

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