محسن قائم على التكلفة

يمكن ل Spark SQL استخدام محسن قائم على التكلفة (CBO) لتحسين خطط الاستعلام. هذا مفيد بشكل خاص للاستعلامات ذات الصلات المتعددة. لكي يعمل ذلك، من الضروري جمع إحصائيات الجدول والأعمدة وإبقائها محدثة.

جمع الإحصائيات

للحصول على الفائدة الكاملة من CBO، من المهم جمع إحصائيات الأعمدة وإحصائيات الجدول. يمكن جمع الإحصائيات باستخدام الأمر ANALYZE TABLE.

تلميح

للحفاظ على تحديث الإحصائيات، قم بتشغيل ANALYZE TABLE بعد الكتابة إلى الجدول.

التحقق من خطط الاستعلام

هناك عدة طرق للتحقق من خطة الاستعلام.

أمر EXPLAIN

للتحقق مما إذا كانت الخطة تستخدم إحصائيات، استخدم أوامر SQL

  • Databricks Runtime 7.x وما فوق: EXPLAIN

إذا كانت الإحصائيات مفقودة، فقد لا تكون خطة الاستعلام مثالية.

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

هام

الإحصائية rowCount مهمة بشكل خاص للاستعلامات ذات الصلات المتعددة. إذا كانت rowCount مفقودة، فهذا يعني أنه لا توجد معلومات كافية لحسابها (أي أن بعض الأعمدة المطلوبة لا تحتوي على إحصائيات).

واجهة مستخدم Spark SQL

استخدم صفحة واجهة مستخدم Spark SQL لمشاهدة الخطة المنفذة ودقة الإحصائيات.

تقدير مفقود

سطر مثل rows output: 2,451,005 est: N/A يعني أن عامل التشغيل هذا ينتج ما يقرب من صفينM ولم تكن هناك إحصائيات متوفرة.

تقدير جيد

يعني سطر مثل rows output: 2,451,005 est: 1616404 (1X) أن عامل التشغيل هذا ينتج صفوفا 2M. بينما كان التقدير تقريبيا. 1.6M وكان عامل خطأ التقدير 1.

تقدير غير عام

سطر مثل rows output: 2,451,005 est: 2626656323 يعني أن عامل التشغيل هذا ينتج ما يقرب من 2M صفا بينما كان التقدير 2B صفا، لذلك كان عامل خطأ التقدير 1000.

تعطيل المحسن المستند إلى التكلفة

يتم تمكين CBO بشكل افتراضي. يمكنك تعطيل CBO عن طريق تغيير العلامة spark.sql.cbo.enabled .

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