SQL معايير التصفية في الانضمام إلى معايير أو جملة where التي هي أكثر كفاءة

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

سؤال

لدي بسيطة نسبيا الاستعلام الانضمام إلى اثنين من الجداول."حيث" معايير يمكن التعبير عنها إما في الانضمام إلى معايير أو جملة where.أنا أتساءل والتي هي أكثر كفاءة.

الاستعلام هو العثور على ماكس مبيعات بائع من بداية الوقت حتى تم ترقيته.

حالة 1

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
                  and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

الحالة 2

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

ملاحظة حالة 1 يفتقر إلى جملة where تماما

RDBMS هو Sql Server 2005

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

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

المحلول

أنا لن تستخدم أداء العامل الحاسم هنا - و بصراحة أنا لا أعتقد أن هناك أي أداء قابلة للقياس الفرق بين هاتين الحالتين حقا.

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

مجرد مسألة حفظ الأشياء نظيفة ووضع الأشياء التي تنتمي إليها ، المنظمة البحرية الدولية.

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

مارك

نصائح أخرى

يمكنك تشغيل خطة التنفيذ مقدر و منشئ ملفات التعريف sql أن نرى كيف كومة ضد بعضها البعض.

ومع ذلك ، فهي لغويا نفسه تحت غطاء محرك السيارة وفقا لهذا SQL Server MVP:

http://www.eggheadcafe.com/conversation.aspx?messageid=29145383&threadid=29145379

أنا أفضل أن يكون أي الثابت ترميز المعايير في الانضمام.يجعل SQL أكثر للقراءة المحمولة.

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

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

على سبيل المثال:

FROM
table1 t1
JOIN table2 t2_ABC ON
  t1.c1 = t2_ABC.c1 AND
  t2_ABC.c2 = 'ABC'

إذا كنت تحتاج إلى الحصول على العمود الثاني من الجدول 2 فقط نسخ تلك الكتلة في المفكرة, البحث/ريبالسي "اي بي سي" و المعزوفة و جديدة كاملة كتلة من التعليمات البرمجية جاهزة للصق مرة أخرى.

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

أنا الاحتياطي جملة WHERE بدقة وقت التشغيل المعايير قدر الإمكان.

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

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

ولكن أنا حددت فرق واحد ، يمكنك استخدام الخاص بك المنطقي يحتاج..

  1. باستخدام المعايير في على شرط لا مرشح/تخطي الصفوف لتحديد بدلا من ذلك الانضمام إلى الأعمدة تكون فارغة على أساس الشروط

  2. باستخدام المعايير في حيث شرط قد مرشح/تخطي الصفوف في كامل النتائج

أنا لا أعتقد أنك سوف تجد محدود الإجابة عن هذا ينطبق على جميع الحالات.2 ليست دائما قابلة للتبديل - منذ لبعض الاستفسارات (بعض اليسار ينضم) سوف يأتي مع نتائج مختلفة من خلال وضع معايير في مكان مقابل من خط.

في حالتك يجب عليك تقييم كل من هذه الاستفسارات.في SSMS ، يمكنك عرض التقديرية والفعلية تنفيذ خطط كل من هذه الاستفسارات - أن يكون الخطوة الأولى في تحديد ما هو أكثر الأمثل.يمكنك أيضا عرض الوقت & IO لكل (مجموعة إحصاءات الوقت على تعيين io إحصائيات) - وهذا أيضا تعطيك المعلومات في عملية اتخاذ القرار.

في حالة الاستفسارات في سؤالك - أراهن أن كلاهما يخرج مع نفس خطة الاستعلام - حتى في هذه الحالة قد لا يهم, ولكن في حالات أخرى يمكن أن تنتج مختلف الخطط.

هذه محاولة لمعرفة الفرق بين 2...

SET STATISTICS IO ON
SET STATISTICS TIME ON

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid =sales.salesmanid
       and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid = sales.salesmanid 
where  sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

SET STATISTICS TIME OFF
SET STATISTICS IO OFF

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

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

لا هو أكثر كفاءة باستخدام أين ويعتبر الأسلوب القديم طريقة للقيام بذلك (http://msdn.microsoft.com/en-us/library/ms190014.aspx).يمكنك أن تبحث في تنفيذ خطة ورؤية يفعلون نفس الشيء.

تصبح مألوفة مع المقدرة خطة التنفيذ في SQL server إدارة Studio!!كما قال آخرون ، أنت في رحمة محلل مهما فعلت لذا ثق تقديراتها.أعتقد أن اثنين قدمت من شأنها أن تنتج بالضبط نفس الخطة.

إذا كان محاولة لتغيير ثقافة التنمية ، واختيار واحد التي تمنحك أفضل خطة ؛ لتلك التي هي متطابقة ، اتبع الثقافة

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

قضية 1 (معايير الانضمام) هو أفضل التغليف ، وزيادة التغليف هو عادة شيء جيد:انخفضت نسخ/لصق السهو إلى استعلام آخر ، انخفضت الخلل إذا كان في وقت لاحق تحويلها إلى اليسار الانضمام ، وزيادة القراءة (الأشياء المتصلة معا أقل من "الضوضاء" في جملة WHERE).في هذه الحالة, حيث شرط فقط يلتقط الرئيسية الجدول معايير أو المعايير التي تمتد من جداول متعددة.

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