Maliyet tabanlı iyileştirici

Spark SQL, sorgu planlarını geliştirmek için maliyet tabanlı iyileştirici (CBO) kullanabilir. Bu, özellikle birden çok birleşime sahip sorgular için kullanışlıdır. Bunun çalışması için tablo ve sütun istatistiklerinin toplanması ve güncel tutulması kritik önem taşır.

İstatistikleri toplama

CBO'nun tüm avantajlarından yararlanmak için hem sütun istatistiklerini hem de tablo istatistiklerinitoplamak önemlidir. İstatistikler, ANALYZE TABLE komutu kullanılarak toplanabilir.

İpucu

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

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 komutlarını kullanın

  • Databricks Runtime 7.x ve üzeri: EXPLAIN

İ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. Eksikse rowCount , bunu hesaplamak için yeterli bilgi olmadığı anlamına gelir (başka bir deyişle, bazı gerekli sütunlarda istatistik yoktur).

Spark SQL Kullanıcı Arabirimi

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ı İyileştiriciyi Devre Dışı Bırakma

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

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