سؤال

وأحتاج المشورة بخصوص أداء subselect في الخلية. لسبب أنني لا يمكن أن تتغير، وأنا لست قادرا على استخدام التسجيل لإنشاء فلتر quesry، ويمكنني أن أضيف فقط آخر AND بند في WHERE.

ما هو الاداء من:

select tasks.*
from tasks
where 
  some criteria
  and task.project_id not in (select id from project where project.is_template = 1);

ومقارنة:

select tasks.*
from tasks, project
where
  some criteria
  and task.project_id = project.id and project.is_template <> 1;

لاحظ أن هناك عدد قليل نسبيا من مشاريع whete is_template = 1، ويمكن أن يكون هناك عدد كبير من المشاريع التي is_template <> 1.

هل هناك وسيلة أخرى لتحقيق نفس النتيجة دون subselects إذا كنت لا تستطيع تغيير أي شيء ولكن وتصفية؟

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

المحلول

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

EXPLAIN select tasks.*
from tasks
where 
  some criteria
  and task.project_id not in (select id from project where project.is_template = 1);

EXPLAIN select tasks.*
from tasks, project
where
  some criteria
  and task.project_id = project.id and project.is_template <> 1;

نصائح أخرى

وكم الفرق هناك بين الاثنين يمكن أن تعتمد إلى حد كبير على ما "بعض المعايير" هو وما هي الفرص لاستخدام الفهارس التي يقدمها. ولكن لاحظ أنهم ليسوا يعادل من حيث النتائج إذا كان هناك المهام التي ليس لديها مشاريع. والثاني هو ما يعادل هذا:

select tasks.*
from tasks
where 
  some criteria
  and task.project_id in (select id from project where project.is_template <> 1);

وأعتقد أن البداية قد مقياس أفضل:

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

والنتيجة: إذا كان هناك 10 من كل، فإنه سيكون لديك 10 * 10 = 100. صفوف يمكنك أن ترى كيف هذا يحصل كبيرة مع ارتفاع الأرقام. ومن ثم يطبق فيها إلى هذا الجدول المؤقت.

وعلى النقيض من ذلك، فإن فرعي يختار فقط الصفوف ذات الصلة من كل جدول.

ولكن ما لم التحجيم هو مصدر قلق، وأنا لا أعتقد أنه يهم حقا.

وتجنب الاستعلامات الفرعية مثل الطاعون في الإصدارات الخلية <6.0، وأنا أشك في أنك كنت تستخدم 6.0 معتبرا انه لا يزال في مرحلة ألفا للتنمية. AFAIK، محسن الخلية لا يعالج الاستعلامات الفرعية جيدا على الإطلاق. وقد ذهب بعض عمل كبير في تجديد محسن عن 6.0 والاستفسارات الفرعية تعمل الآن أفضل بكثير، ولكن هذه التغييرات لم يتسرب إلى أسفل داخل سلسلة 5.0 أو 5.1.

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