محسن قائم على التكلفة
يمكن ل Spark SQL استخدام محسن قائم على التكلفة (CBO) لتحسين خطط الاستعلام. هذا مفيد بشكل خاص للاستعلامات ذات الصلات المتعددة. لكي يعمل ذلك، من الضروري جمع إحصائيات الجدول والأعمدة وإبقائها محدثة.
جمع الإحصائيات
للحصول على الفائدة الكاملة من CBO، من المهم جمع إحصائيات الأعمدة وإحصائيات الجدول. يمكنك استخدام ANALYZE TABLE
الأمر لتجميع الإحصائيات يدويا.
تلميح
للحفاظ على تحديث الإحصائيات، قم بتشغيل ANALYZE TABLE
بعد الكتابة إلى الجدول.
استخدام ANALYZE
هام
التحسين التنبؤي مع ANALYZE
هو في المعاينة العامة. وهو يتضمن مجموعة إحصائيات ذكية أثناء عمليات الكتابة. استخدم هذا النموذج للتسجيل في المعاينة العامة.
يعمل ANALYZE
التحسين التنبؤي تلقائيا ، وهو أمر لتجميع الإحصائيات، على الجداول المدارة في كتالوج Unity. توصي Databricks بتمكين التحسين التنبؤي لجميع الجداول المدارة في كتالوج Unity لتبسيط صيانة البيانات وتقليل تكاليف التخزين. راجع تحليل الجدول.
التحقق من خطط الاستعلام
هناك عدة طرق للتحقق من خطة الاستعلام.
أمر 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)