استراتيجية جلب السبات - متى تستخدم "الانضمام" ومتى تستخدم "التحديد"؟

StackOverflow https://stackoverflow.com/questions/617145

  •  03-07-2019
  •  | 
  •  

سؤال

تدعم معظم جمعيات السبات معلمة "الجلب":

fetch="join|select"

مع كون "تحديد" هي القيمة الافتراضية.

كيفية تحديد أي واحد لاستخدامه في أي جمعية؟

لقد حاولت تغيير الكل من "تحديد" إلى "انضمام" على مستوى التطبيق - ربما انخفض عدد الاستعلامات التي تم إنشاؤها 10 مرات ولكن الأداء ظل كما هو تمامًا (حتى أصبح أسوأ قليلاً).

شكرًا.

هل كانت مفيدة؟

المحلول

وتاريخ من المفترض أن يحل ن + 1 المشكلة. إذا كان لديك 10 الآباء، ولكل منها 10 أطفال، والانضمام سيتطلب استعلام واحد، وسوف تتطلب 11 (واحد للوالدين واحدة للأطفال كل من الوالدين) تحديد. هذا قد لا يكون مشكلة كبيرة إذا كانت قاعدة البيانات على نفس الخادم مثل التطبيق أو إذا كانت الشبكة بسرعة حقا، ولكن إذا كان هناك الكمون في كل استدعاء قاعدة بيانات، يمكن أن تضيف ما يصل. طريقة الانضمام قليلا أقل كفاءة في الاستعلام الأولي لأنك تكرار الأعمدة الأصل في كل صف، ولكن إجراء واحد فقط ذهابا وإيابا إلى قاعدة البيانات.

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

نصائح أخرى

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

واختر:

SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

وتاريخ:

SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

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

وإذا كان الوالد لديه الكثير من الأطفال وهؤلاء الأطفال بدوره لديك الكثير غيرها، ثم في هذه الحالة الأولي "الانضمام" قد خنق الشبكة. اقتراحي هو استخدام 'اختر' في هذه الحالة لتقسيم يختار.

جلب = "الانضمام"إذا قمت بجلب = "الانضمام" فإنه سيتم استرداد كافة المعلومات في عبارة تحديد واحدة.

جلب = "حدد"إذا كنت تريد تشغيل عبارة التحديد الثانية لجلب المجموعة المرتبطة، فستستخدم في هذه الحالة fetch='select'.

مصدر :استراتيجيات جلب السبات

ويفضل عادة، لأسباب تتعلق بالأداء JOIN.

والسبب واحد لاستخدام SELECT هو إذا كنت ترحيل النتائج (تحديد إزاحة وحد) التي لها علاقة عديدة لكثير. إذا كنت تستخدم التسجيل، ستظهر الكيان الجذر عدة مرات إذا كان يحتوي على العديد العديد إلى العديد من الأطفال وتلك "نسخ" العد ضد الحد الخاص بك (حتى لو السبات ينهار بعد وقوعها باستخدام DISTINCT_ROOT_ENTITY).

يتحدث الناس دائمًا عن استخدام الأداء جلب=انضمام.ولكن كما أعتقد، من المهم بالنسبة لنا أن نفهم عدد سجلات الوالدين/الطفل التي نجلبها:

إذا كنت ترغب في جلب سجل ولي الأمر واحد فقط وتتوقع ألا يحتوي على العديد من الأطفال، فأنا أقترح عليك استخدامه جلب=SELECT.

إذا كنت ترغب في جلب جميع سجلات الوالدين بما في ذلك سجلات الأطفال، فمن الأفضل أن تبحث عنها جلب=انضمام

فقط لإضافة ملاحظة أنه إذا كانت السجلات تجلب الأطفال بتكاسل (كسول = صحيح)، فلن يكون له أي معنى في الاستخدام جلب=انضمام نظرًا لأنه يتم تحميل جميع سجلات الوالدين والطفل في طلقة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top