تحسين الانضمام إلى النطاق

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

توصي Databricks باستخدام تلميحات الانضمام لصلات النطاق عندما يكون الأداء ضعيفا.

نقطة في صلة نطاق الفاصل الزمني

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

-- using BETWEEN expressions
SELECT *
FROM points JOIN ranges ON points.p BETWEEN ranges.start and ranges.end;

-- using inequality expressions
SELECT *
FROM points JOIN ranges ON points.p >= ranges.start AND points.p < ranges.end;

-- with fixed length interval
SELECT *
FROM points JOIN ranges ON points.p >= ranges.start AND points.p < ranges.start + 100;

-- join two sets of point values within a fixed distance from each other
SELECT *
FROM points1 p1 JOIN points2 p2 ON p1.p >= p2.p - 10 AND p1.p <= p2.p + 10;

-- a range condition together with other join conditions
SELECT *
FROM points, ranges
WHERE points.symbol = ranges.symbol
  AND points.p >= ranges.start
  AND points.p < ranges.end;

ربط نطاق تداخل الفاصل الزمني

صلة نطاق تداخل الفاصل الزمني هي صلة يحتوي فيها الشرط على دالات تقييم تحدد تداخل الفواصل الزمنية بين قيمتين من كل علاقة. على سبيل المثال:

-- overlap of [r1.start, r1.end] with [r2.start, r2.end]
SELECT *
FROM r1 JOIN r2 ON r1.start < r2.end AND r2.start < r1.end;

-- overlap of fixed length intervals
SELECT *
FROM r1 JOIN r2 ON r1.start < r2.start + 100 AND r2.start < r1.start + 100;

-- a range condition together with other join conditions
SELECT *
FROM r1 JOIN r2 ON r1.symbol = r2.symbol
  AND r1.start <= r2.end
  AND r1.end >= r2.start;

تحسين الانضمام إلى النطاق

يتم تنفيذ تحسين الانضمام إلى النطاق للصلات التي:

  • لديك شرط يمكن تفسيره كنقطة في فاصل زمني أو صلة نطاق تداخل فاصل زمني.
  • جميع القيم المتضمنة في شرط الانضمام إلى النطاق هي من نوع رقمي (متكامل أو فاصلة عائمة أو عشرية) DATEأو أو .TIMESTAMP
  • جميع القيم المتضمنة في شرط الانضمام إلى النطاق من نفس النوع. في حالة النوع العشري، يجب أن تكون القيم أيضا بنفس الحجم والدقة.
  • وهو INNER JOIN، أو في حالة نقطة في ربط نطاق الفاصل الزمني، LEFT OUTER JOIN مع قيمة نقطة على الجانب الأيسر، أو RIGHT OUTER JOIN مع قيمة النقطة على الجانب الأيمن.
  • لديك معلمة ضبط حجم الحاوية.

حجم الحاوية

حجم الحاوية هو معلمة ضبط رقمية تقسم مجال القيم لشرط النطاق إلى عدة سلال متساوية الحجم. على سبيل المثال، مع حجم سلة من 10، يقسم التحسين المجال إلى سلال التي هي فواصل زمنية من الطول 10. إذا كانت لديك نقطة في شرط p BETWEEN start AND endالنطاق وهي start 8 و22 end ، فإن الفاصل الزمني للقيمة هذا يتداخل مع ثلاث سلال طولها 10 - أول سلة من 0 إلى 10، والفاصلة الثانية من 10 إلى 20، والفاصلة الثالثة من 20 إلى 30. يجب فقط اعتبار النقاط التي تقع ضمن نفس الخانات الثلاث بمثابة تطابقات الانضمام المحتملة لهذا الفاصل الزمني. على سبيل المثال، إذا كان p هو 32، يمكن استبعاده على أنه يقع بين start 8 و22 end ، لأنه يقع في الحاوية من 30 إلى 40.

إشعار

  • بالنسبة للقيم DATE ، يتم تفسير قيمة حجم الحاوية على أنها أيام. على سبيل المثال، تمثل قيمة حجم الحاوية 7 أسبوعا.
  • بالنسبة للقيم TIMESTAMP ، يتم تفسير قيمة حجم الحاوية على أنها ثوان. إذا كانت قيمة ثانية فرعية مطلوبة، يمكن استخدام القيم الكسرية. على سبيل المثال، تمثل قيمة حجم الحاوية 60 دقيقة، وتمثل قيمة حجم الحاوية 0.1 100 مللي ثانية.

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

تمكين الانضمام إلى النطاق باستخدام تلميح الانضمام إلى النطاق

لتمكين تحسين الانضمام إلى النطاق في استعلام SQL، يمكنك استخدام تلميح الانضمام إلى النطاق لتحديد حجم الحاوية. يجب أن يحتوي التلميح على اسم العلاقة لأحد العلاقات المنضمة ومعلمة حجم الحاوية الرقمية. يمكن أن يكون اسم العلاقة جدولا أو طريقة عرض أو طلب فرعي.

SELECT /*+ RANGE_JOIN(points, 10) */ *
FROM points JOIN ranges ON points.p >= ranges.start AND points.p < ranges.end;

SELECT /*+ RANGE_JOIN(r1, 0.1) */ *
FROM (SELECT * FROM ranges WHERE ranges.amount < 100) r1, ranges r2
WHERE r1.start < r2.start + 100 AND r2.start < r1.start + 100;

SELECT /*+ RANGE_JOIN(c, 500) */ *
FROM a
  JOIN b ON (a.b_key = b.id)
  JOIN c ON (a.ts BETWEEN c.start_time AND c.end_time)

إشعار

في المثال الثالث، يجب وضع التلميح على c. وذلك لأن الصلات تترك مقترنة، لذلك يتم تفسير الاستعلام على أنه (a JOIN b) JOIN c، وينطبق التلميح على a على الصلة a مع b وليس الصلة مع c.

#create minute table
minutes = spark.createDataFrame(
    [(0, 60), (60, 120)],
    "minute_start: int, minute_end: int"
)

#create events table
events = spark.createDataFrame(
    [(12, 33), (0, 120), (33, 72), (65, 178)],
    "event_start: int, event_end: int"
)

#Range_Join with "hint" on the from table
(events.hint("range_join", 60)
  .join(minutes,
    on=[events.event_start < minutes.minute_end,
    minutes.minute_start < events.event_end])
  .orderBy(events.event_start,
    events.event_end,
    minutes.minute_start)
  .show()
)

#Range_Join with "hint" on the join table
(events.join(minutes.hint("range_join", 60),
  on=[events.event_start < minutes.minute_end,
    minutes.minute_start < events.event_end])
  .orderBy(events.event_start,
    events.event_end,
    minutes.minute_start)
  .show()
)

يمكنك أيضا وضع تلميح الانضمام إلى نطاق على أحد DataFrames المنضمة. في هذه الحالة، يحتوي التلميح على معلمة حجم الحاوية الرقمية فقط.

val df1 = spark.table("ranges").as("left")
val df2 = spark.table("ranges").as("right")

val joined = df1.hint("range_join", 10)
  .join(df2, $"left.type" === $"right.type" &&
     $"left.end" > $"right.start" &&
     $"left.start" < $"right.end")

val joined2 = df1
  .join(df2.hint("range_join", 0.5), $"left.type" === $"right.type" &&
     $"left.end" > $"right.start" &&
     $"left.start" < $"right.end")

تمكين الانضمام إلى النطاق باستخدام تكوين الجلسة

إذا كنت لا تريد تعديل الاستعلام، يمكنك تحديد حجم الحاوية كمعلمة تكوين.

SET spark.databricks.optimizer.rangeJoin.binSize=5

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

اختيار حجم الحاوية

تعتمد فعالية تحسين الانضمام إلى النطاق على اختيار حجم الحاوية المناسب.

ينتج عن حجم سلة صغيرة عدد أكبر من الخانات، مما يساعد في تصفية التطابقات المحتملة. ومع ذلك، يصبح غير فعال إذا كان حجم الحاوية أصغر بكثير من فواصل القيمة التي تمت مصادفتها، وتتداخل فواصل القيم الزمنية مع فواصل زمنية متعددة. على سبيل المثال، مع شرط p BETWEEN start AND end، حيث start هو 1,000,000 و1,999,999 end ، وحجم سلة من 10، يتداخل الفاصل الزمني للقيمة مع 100,000 سلة.

إذا كان طول الفاصل الزمني موحدا إلى حد ما ومعروفا، نوصي بتعيين حجم الحاوية إلى الطول المتوقع النموذجي للفاصل الزمني للقيمة. ومع ذلك، إذا كان طول الفاصل الزمني متغيرا ومنحرفا، يجب العثور على رصيد لتعيين حجم سلة يقوم بتصفية الفواصل الزمنية القصيرة بكفاءة، مع منع الفواصل الزمنية الطويلة من التداخل مع عدد كبير جدا من الخانات. بافتراض جدول ranges، مع فواصل زمنية بين الأعمدة start و end، يمكنك تحديد النسب المئوية المختلفة لقيمة طول الفاصل الزمني المنحرفة باستخدام الاستعلام التالي:

SELECT APPROX_PERCENTILE(CAST(end - start AS DOUBLE), ARRAY(0.5, 0.9, 0.99, 0.999, 0.9999)) FROM ranges

سيكون الإعداد الموصى به لحجم الحاوية هو الحد الأقصى للقيمة عند القيمة المئوية 90، أو القيمة عند النسبة المئوية 99 مقسومة على 10، أو القيمة عند القيمة المئوية 99.9 مقسومة على 100 وهكذا. الأساس المنطقي هو:

  • إذا كانت القيمة عند القيمة المئوية 90 هي حجم الحاوية، فإن 10٪ فقط من أطوال الفاصل الزمني للقيمة أطول من الفاصل الزمني للحاصلة، لذلك تمتد أكثر من فواصل زمنية لحاصلتين متجاورة.
  • إذا كانت القيمة عند القيمة المئوية 99 هي حجم الحاوية، فإن 1٪ فقط من أطوال الفاصل الزمني للقيمة تمتد على أكثر من 11 فاصلا زمنيا مجاورا للحاصلة.
  • إذا كانت القيمة عند القيمة المئوية 99.9 هي حجم الحاوية، فإن 0.1٪ فقط من أطوال الفاصل الزمني للقيمة تمتد على أكثر من 101 فاصل زمني لحاصلة متجاورة.
  • يمكن تكرار نفس الشيء للقيم في 99.99th، والنسب المئوية 99.999، وهكذا إذا لزم الأمر.

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