تحسين الانضمام إلى الانحراف

انحراف البيانات شرط فيه بيانات جدول غير متساو موزعة بين الأقسام في الكتلة. يمكن أن يؤدي انحراف البيانات إلى خفض أداء الاستعلامات بشكل كبير ، خاصة تلك التي لها صلات. الصلات بين الجداول الكبيرة تتطلب خلط البيانات ويمكن أن يؤدي الانحراف إلى اختلال التوازن الشديد للعمل في الكتلة. من المحتمل أن يؤثر انحراف البيانات على استعلام إذا بدا أن استعلاما عالقا في إنهاء عدد قليل جدا من المهام (على سبيل المثال، المهام ال 3 الأخيرة من أصل 200). للتحقق من أن انحراف البيانات يؤثر على استعلام:

  1. انقر فوق المرحلة التي عالقة وتحقق من أنه يقوم صلة.
  2. بعد انتهاء الاستعلام، ابحث عن المرحلة التي تقوم بالانضمام وتحقق من توزيع مدة المهمة.
  3. فرز المهام عن طريق تقليل المدة والتحقق من المهام القليلة الأولى. إذا استغرق إكمال مهمة واحدة وقتا أطول بكثير من المهام الأخرى، فهناك انحراف.

لتحسين الانحراف ، دلتا ليك على Azure Databricks SQL يقبل تلميحات الانحراف في الاستعلامات. مع المعلومات من تلميح انحراف، Databricks وقت التشغيل يمكن بناء خطة استعلام أفضل، واحد لا يعاني من انحراف البيانات.

ملاحظة

مع Databricks Runtime 7.3 وما فوق، لا يلزم تلميحات الانضمام المنحرفة. يتم تلقائيا رعاية Skew إذا تم تمكين تنفيذ الاستعلام التكيفي (AQE) spark.sql.adaptive.skewJoin.enabled وكلاهما. راجع تنفيذ الاستعلام التكيفي.

تكوين تلميح انحراف مع اسم العلاقة

يجب أن يحتوي تلميح الانحراف على الأقل على اسم العلاقة مع الانحراف. العلاقة هي جدول أو طريقة عرض أو قائمة ثانوية. جميع الصلات مع هذه العلاقة ثم استخدام الانحراف الانضمام الأمثل.

-- table with skew
SELECT /*+ SKEW('orders') */ * FROM orders, customers WHERE c_custId = o_custId

-- subquery with skew
SELECT /*+ SKEW('C1') */ *
  FROM (SELECT * FROM customers WHERE c_custId < 100) C1, orders
  WHERE C1.c_custId = o_custId

تكوين تلميح انحراف مع اسم العلاقة وأسماء الأعمدة

قد يكون هناك صلات متعددة على علاقة وبعضها فقط سوف تعاني من الانحراف. الانحراف الانضمام الأمثل لديه بعض النفقات العامة لذلك فمن الأفضل لاستخدامه فقط عند الحاجة. لهذا الغرض، يقبل تلميح الانحراف أسماء الأعمدة. فقط الصلات مع هذه الأعمدة استخدام تحسين صلة الانحراف.

-- single column
SELECT /*+ SKEW('orders', 'o_custId') */ *
  FROM orders, customers
  WHERE o_custId = c_custId

-- multiple columns
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId')) */ *
  FROM orders, customers
  WHERE o_custId = c_custId AND o_storeRegionId = c_regionId

تكوين تلميح الانحراف باستخدام اسم العلاقة وأسماء الأعمدة وقيم الانحراف

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

-- single column, single skew value
SELECT /*+ SKEW('orders', 'o_custId', 0) */ *
  FROM orders, customers
  WHERE o_custId = c_custId

-- single column, multiple skew values
SELECT /*+ SKEW('orders', 'o_custId', (0, 1, 2)) */ *
  FROM orders, customers
  WHERE o_custId = c_custId

-- multiple columns, multiple skew values
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId'), ((0, 1001), (1, 1002))) */ *
  FROM orders, customers
  WHERE o_custId = c_custId AND o_storeRegionId = c_regionId