انحراف تحسين الانضمام باستخدام تلميحات الانحراف

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

إشعار

تلميحات الانضمام المنحرفة غير مطلوبة. يتم رعاية الانحراف تلقائيا إذا كان تنفيذ الاستعلام التكيفي (AQE) وكلاهما spark.sql.adaptive.skewJoin.enabled ممكنين. راجع تنفيذ الاستعلام التكيفي.

ما المقصود بانحراف البيانات؟

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

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

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

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

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

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

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

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

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