سؤال

لدي استعلام تحديد متعدد الطاولة يقارن قيم الأعمدة مع نفسه كما هو موضح أدناه:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

هذا يبدو زائدا بالنسبة لي. استعلامي هو ، هل سيكون لإزالتها أي تأثير على المنطق/الأداء؟

شكرا مقدما.

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

المحلول

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

إذا كانت الأعمدة قابلة للإلغاء ، فيمكنك استبدال هذه الخطوط بأمان (أسهل في القراءة ، أسهل في الحفاظ عليها):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


تحديث بعد تعليق جيفري

أنت على حق تمامًا ، لا أعرف كيف لم أرها بنفسي: حالة الانضمام t1.col1=t2.col1 يشير إلى أنه سيتم النظر في الصفوف فقط مع أعمدة الانضمام وليس الفارغ. الجمل tx.col1=tx.col1 لذلك فهي زائدة تمامًا ويمكن إزالتها بأمان.

نصائح أخرى

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

لا تحاول إصلاح شيء يعمل حتى تتأكد من أنك لا تكسر شيئًا آخر.

السبب في أنني أذكر ذلك لأننا ورثنا تطبيق الإبلاغ القديم الذي كان له هذا البناء بالضبط ، على غرار:

where id = id

وكوني زميلًا معقولًا ، فقد تخلصت منه ، فقط لاكتشاف أن محرك قاعدة البيانات لم يكن الشيء الوحيد الذي يستخدم الاستعلام.

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

حسنًا ، تخيل دهشتنا للتكرار التالي عندما تباطأ قاعدة البيانات إلى جزء صغير من سرعتها السابقة عندما كان المستخدمون يقومون باستعلامات مخصصة على id مجال :-)

تبين أن هذا كان بمثابة kludge من قبل فريق الدعم السابق لضمان أن الاستعلامات المخصصة المشتركة كانت تستخدم الأعمدة المفهرسة أيضًا ، على الرغم من أن أيا من استعلاماتنا القياسية لم تفعل ذلك.

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

  1. نعم ، من الواضح أن الشروط زائدة عن الحاجة لأنها متطابقة!

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. لكنك تحتاج إلى واحد منهم على الأقل. خلاف ذلك ، سيكون لديك انضمام ديكارت على يديك: سيتم ربط كل صف من Table1 إلى كل صف في Table2. إذا كان لدى Table1 100 صف ، وكان لدى Table2 1000 صف ، فإن الاستعلام الناتج سيعود 100000 نتيجة.

    SELECT * FROM table1 t1,table2 t2 --warning!
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top