Bagikan melalui


Pengoptimal berbasis biaya

Spark SQL dapat menggunakan pengoptimal berbasis biaya (CBO) untuk meningkatkan rencana kueri. Ini sangat berguna untuk kueri dengan beberapa gabungan. Agar ini berfungsi, sangat penting untuk mengumpulkan statistik tabel dan kolom dan selalu memperbaruinya.

Mengumpulkan statistik

Untuk mendapatkan manfaat penuh dari CBO, penting untuk mengumpulkan statistik kolom dan statistik tabel . Anda dapat menggunakan ANALYZE TABLE perintah untuk mengumpulkan statistik secara manual.

Tip

Untuk mempertahankan statistik up-to-date, jalankan ANALYZE TABLE setelah menulis ke tabel.

Menggunakan ANALYZE

Pengoptimalan prediktif menjalankan secara otomatis ANALYZE, yaitu perintah untuk mengumpulkan statistik, pada tabel yang dikelola oleh Unity Catalog. Databricks merekomendasikan untuk mengaktifkan pengoptimalan prediktif untuk semua tabel terkelola Unity Catalog untuk menyederhanakan pemeliharaan data dan mengurangi biaya penyimpanan. Lihat ANALYZE TABLE.

Memverifikasi rencana kueri

Ada beberapa cara untuk memverifikasi rencana kueri.

EXPLAIN perintah

Untuk memeriksa apakah rencana menggunakan statistik, gunakan perintah EXPLAIN.

Jika statistik hilang maka rencana kueri mungkin tidak optimal.

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

Penting

Statistik rowCount ini sangat penting untuk kueri dengan beberapa gabungan. Jika rowCount hilang, itu berarti tidak ada cukup informasi untuk menghitungnya (artinya, beberapa kolom yang diperlukan tidak memiliki statistik).

Dalam Databricks Runtime 16.0 ke atas, output EXPLAIN perintah mencantumkan tabel yang dirujuk yang memiliki statistik hilang, parsial, dan penuh, seperti dalam contoh output berikut:

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

Antarmuka Pengguna Spark SQL

Gunakan halaman antarmuka pengguna Spark SQL untuk melihat rencana yang dieksekusi dan akurasi statistik.

Perkiraan hilang

Garis seperti rows output: 2,451,005 est: N/A itu berarti bahwa operator ini menghasilkan sekitar 2 juta baris dan tidak ada statistik yang tersedia.

Perkiraan yang baik

Garis seperti rows output: 2,451,005 est: 1616404 (1X) itu berarti bahwa operator ini menghasilkan sekitar 2 juta baris, sedangkan perkiraannya sekitar 1,6M dan faktor kesalahan estimasi adalah 1.

Perkiraan buruk

Garis seperti rows output: 2,451,005 est: 2626656323 itu berarti bahwa operator ini menghasilkan sekitar 2 juta baris, sedangkan perkiraannya sekitar 2 juta baris, jadi faktor kesalahan estimasi adalah 1.000.

Menonaktifkan Pengoptimal Cost-Based

CBO diaktifkan secara default. Anda menonaktifkan CBO dengan mengubah bendera spark.sql.cbo.enabled.

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