• 0

أحاول عمل الدمج بين عدد كبير من الجداول join multiple tables ولكن الاستعلام بطيئ جداً كيف أسرعه SQL

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

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

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

أي بدل عمل التالي:

SELECT 
table1_id, -- مكرر وهو عمود الربط
table2_name, -- جلب حقل الاسم من باقي الجداول
table3_name, 
table4_name, 
table5_name, 
table6_name, 
table7_name, 
table8_name, 
table9_name 

FROM table1 
  LEFT JOIN table2 ON (table2_id = table1_id) 
  LEFT JOIN table3 ON (table3_id = table1_id) 
  LEFT JOIN table4 ON (table4_id = table1_id)
  LEFT JOIN table5 ON (table5_id = table1_id)
  LEFT JOIN table6 ON (table6_id = table1_id) 
  LEFT JOIN table7 ON (table7_id = table1_id)
  LEFT JOIN table8 ON (table8_id = table1_id)
  LEFT JOIN table9 ON (table9_id = table1_id)

نبدله بالتالي:

SELECT table1_id, 
        (select table2_name from table2 where table1_id = table2_id), 
        (select table3_name from table3 where table1_id = table3_id), 
        (select table4_name from table4 where table1_id = table4_id), 
        (select table5_name from table5 where table1_id = table5_id), 
        (select table6_name from table6 where table1_id = table6_id), 
        (select table7_name from table7 where table1_id = table7_id), 
        (select table8_name from table8 where table1_id = table8_id), 
        (select table9_name from table9 where table1_id = table9_id)  FROM table1

تعتبر هذه من الحالات التي يكون فيها أداء SubQuery أسرع من عمل JOIN

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • -1

يمكنك استخدام الشكل التالي عوضا عن الطريقة التقليدية لتحسين الأداء:

SELECT t1_id, 
        (select t2_name from t2 where t1_id = t2_id), 
        (select t3_name from t3 where t1_id = t3_id), 
        (select t4_name from t4 where t1_id = t4_id), 
        (select t5_name from t5 where t1_id = t5_id), 
        (select t6_name from t6 where t1_id = t6_id), 
        (select t7_name from t7 where t1_id = t7_id), 
        (select t8_name from t8 where t1_id = t8_id), 
        (select t9_name from t9 where t1_id = t9_id)  FROM t1

كذلك يمكنك فعلها بشكل منفصل هكذا:

select ... from t1
innerjoin t2 on t1.pk=t2.fk
leftjoin t3 on t1.pk=t3.fk

أو يتجميع كافة الاختيارات أولا قبل عملية التجميع join بحيث يكون البحث أسرع هكذا:

SELECT 
      a.month, a.roadTypeID, a.speed,
      a.pid, a.or, b.pid, b.or, c.pid, c.or, d.pid, d.or,
      e.pid, e.or, f.pid, f.or, g.pid, g.or, h.pid, h.or, 
      i.pid, i.or, j.pid, j.or, k.pid, k.or, l.pid, l.or, 
      m.pid, m.or, n.pid, n.or, o.pid, o.or, p.pid, p.or,
      q.pid, q.or, r.pid, r.or, s.pid, s.or, t.pid, t.or, 
      u.pid, u.or, v.pid, v.or
   FROM 
      wspeed2 a
         JOIN wspeed3  b on a.speed = b.speed
         JOIN wspeed20 c on a.speed = c.speed
         JOIN wspeed24 d on a.speed = d.speed
         JOIN wspeed25 e on a.speed = e.speed
         JOIN wspeed26 f on a.speed = f.speed
         JOIN wspeed27 g on a.speed = g.speed
         JOIN wspeed63 h on a.speed = h.speed
         JOIN wspeed65 i on a.speed = i.speed
         JOIN wspeed68 j on a.speed = j.speed
         JOIN wspeed69 k on a.speed = k.speed
         JOIN wspeed70 l on a.speed = l.speed
         JOIN wspeed71 m on a.speed = m.speed
         JOIN wspeed72 n on a.speed = n.speed
         JOIN wspeed73 o on a.speed = o.speed
         JOIN wspeed74 p on a.speed = p.speed
         JOIN wspeed75 q on a.speed = q.speed
         JOIN wspeed76 r on a.speed = r.speed
         JOIN wspeed77 s on a.speed = s.speed
         JOIN wspeed78 t on a.speed = t.speed
         JOIN wspeed81 u on a.speed = u.speed
         JOIN wspeed82 v on a.speed = v.speed

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن