Maliyet bazlı iyileştirici

Spark SQL, verimli sorgu planları seçmek için maliyet tabanlı bir optimizator (CBO) kullanır. CBO, alternatif planların maliyetini tahmin etmek ve en düşük maliyete sahip planı seçmek için tablo büyüklüğü ve veri dağılımı gibi tablo ve sütun istatistiklerini kullanır. Bu, birden fazla join içeren sorgular için en çok önemlidir; kötü bir plan iyi bir plandan çok daha yavaş olabilir.

CBO varsayılan olarak etkinleştirilmiş ama istatistiklere bağlıdır. İstatistikler eksik veya bayatsa, CBO verimsiz bir join sırası veya join stratejisi seçebilir. Tablo ve sütun istatistiklerini toplayın ve güncel tutun. Bkz. İstatistikleri topla.

Önerilen yöntemler

CBO'nun verimli sorgulama planları seçmesine yardımcı olmak için şu uygulamaları takip edin:

  • Tablolar için istatistikler toplayın çoklu join sorgularında kullanılan. Eğer Unity Catalog yönetilen tablolarda öngörücü optimizasyon kullanırsanız, istatistikler sizin için toplanır. İstatistikleri Topla öğesine bakın.
  • Sorgu planlarını kontrol edin when a çoklu join sorgusu beklenenden daha yavaş olduğunda. Eksik veya yanlış istatistikler yaygın bir sebeptir. Bkz. Sorgu planlarını doğrulama.
  • İstatistikleri silin veya CBO'yu sadece istatistiklerin neden olduğu belirli bir planlama sorununu hafifletmek için devre dışı bırakın. Maliyet tabanlı optimizasyon aracını devre dışı bırak'a bakınız.

İstatistikleri toplama

CBO'nun tüm avantajlarından yararlanmak için hem sütun istatistiklerini hem detablo istatistiklerini toplamak önemlidir. İstatistikleri el ile toplamak için komutunu kullanabilirsiniz ANALYZE TABLE .

İpucu

İstatistikleri güncel tutmak için tabloya yazdıktan sonra ANALYZE TABLE çalıştırın.

ANALYZE komutunu kullanma

Tahmine dayalı iyileştirme, Unity Kataloğu tarafından yönetilen tablolar üzerinde istatistik toplamaya yönelik bir komut olan ANALYZE'ı otomatik olarak çalıştırır. Databricks, veri bakımını basitleştirmek ve depolama maliyetlerini azaltmak için tüm Unity Kataloğu yönetilen tablolarında tahmine dayalı iyileştirmenin etkinleştirilmesini önerir. Bkz.ANALYZE TABLE ... İŞLEM ISTATISTIKLERI.

İyileştirici istatistiklerini kaldırarak iyileştiricinin artık bunlara dayanmaması için (örneğin, istatistiklerin neden olduğu bir planlama sorununu azaltmak için) kaldırabilirsiniz. Bkz. ANALYZE TABLE … DROP STATISTICS.

Sorgu planlarını doğrulama

Sorgu planını doğrulamanın birkaç yolu vardır.

EXPLAIN komut

Planın istatistik kullanıp kullanmadiğini denetlemek için SQL komutunu EXPLAINkullanın.

İstatistikler eksikse sorgu planı en uygun olmayabilir.

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

Önemli

İstatistik rowCount , özellikle birden çok birleşime sahip sorgular için önemlidir. rowCount eksikse, bunu hesaplamak için yeterli bilgi olmadığı anlamına gelir (başka bir deyişle, bazı gerekli sütunlarda istatistik yoktur).

Databricks Runtime 16.0 ve üzeri sürümlerde, EXPLAIN komutunun çıktısı, eksik, kısmi ve tam istatistiklere sahip başvurulan tabloları listeler; örneğin:

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

Spark SQL Kullanıcı Arayüzü

Yürütülen planı ve istatistiklerin doğruluğunu görmek için Spark SQL kullanıcı arabirimi sayfasını kullanın.

Eksik tahmin

Gibi rows output: 2,451,005 est: N/A bir satır, bu işlecin yaklaşık 2M satır ürettiği ve kullanılabilir istatistik olmadığı anlamına gelir.

İyi tahmin

Gibi rows output: 2,451,005 est: 1616404 (1X) bir satır, bu işlecin yaklaşık 2M satır ürettiği, tahmin yaklaşık 1,6M ve tahmin hata faktörü 1 olduğu anlamına gelir.

Hatalı tahmin

Gibi rows output: 2,451,005 est: 2626656323 bir satır, bu işlecin tahmin 2B satır iken yaklaşık 2M satır ürettiği anlamına gelir, bu nedenle tahmin hata faktörü 1000'dir.

Maliyet tabanlı en iyileyiciyi devre dışı bırakın

CBO varsayılan olarak etkindir. Bayrağı değiştirerek CBO'yi devre dışı bırakırsınız.

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