it-swarm.asia

عوامل التشغيل المنطقية OR AND بحالة وترتيب الشروط في حيث

دعونا نفحص هاتين العبارتين:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

إذا CONDITION 1 هو TRUE ، سوف CONDITION 2 يتم التحقق؟
إذا CONDITION 3 هو FALSE ، سوف CONDITION 4 يتم التحقق؟

ماذا عن الشروط في WHERE: هل يقوم محرك SQL Server بتحسين جميع الشروط في عبارة WHERE؟ يجب على المبرمجين وضع الشروط في الترتيب الصحيح للتأكد من أن محسّن SQL Server يحلها في الأيمن بطريقة؟

مضاف:

شكرا لجاك للرابط ، مفاجأة من كود t-sql:

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result

لا يوجد رفع القسمة على صفر استثناء في هذه الحالة.

الخلاصة:

إذا كان C++/C #/VB يحتوي على دائرة قصر ، فلماذا لا يستطيع SQL Server الحصول عليه؟

للإجابة حقًا على هذا ، لنلقي نظرة على كيفية عمل كلاهما مع الظروف. تحتوي C++/C #/VB على دائرة كهربائية قصيرة محددة في مواصفات اللغة لتسريع تنفيذ التعليمات البرمجية. لماذا تهتم بتقييم N OR الشروط عندما يكون الأول صحيحًا بالفعل أو شروط M AND عندما يكون الأول خاطئًا بالفعل.

يجب علينا كمطورين أن ندرك أن SQL Server يعمل بشكل مختلف. إنه نظام قائم على التكلفة. للحصول على خطة التنفيذ المثالية لاستعلامنا ، يجب على معالج الاستعلام تقييم كل حالة مكان وتعيين تكلفة لها. ثم يتم تقييم هذه التكاليف ككل لتشكيل عتبة يجب أن تكون أقل من العتبة المحددة لخادم SQL لخطة جيدة. إذا كانت التكلفة أقل من العتبة المحددة يتم استخدام الخطة ، إذا لم يتم تكرار العملية بأكملها مرة أخرى بمزيج مختلف من تكاليف الحالة. التكلفة هنا إما مسح ضوئي أو طلب أو دمج صلة أو صلة تجزئة وما إلى ذلك ... وبسبب هذا ، لا يمكن استخدام الدائرة القصيرة كما هو متاح في C++/C #/VB. قد تعتقد أن إجبار استخدام الفهرس على عمود يحسب كدائرة قصيرة ولكنه لا. إنه يفرض فقط استخدام هذا المؤشر ، ويقصر بذلك قائمة خطط التنفيذ المحتملة. لا يزال النظام قائمًا على التكلفة.

بصفتك مطورًا ، يجب أن تدرك أن SQL Server لا يقوم بدائرة قصيرة مثلما يحدث في لغات البرمجة الأخرى ولا يوجد شيء يمكنك القيام به لإجباره.

35
garik

لا يوجد ضمان في SQL Server في حالة معالجة العبارات أو ترتيبها في عبارة WHERE. التعبير المفرد الذي يسمح بدائرة قصر العبارة هو CASE-WHEN. ما يلي هو من إجابة نشرتها على Stackoverflow:

كيف يقوم SQL Server بدوائر قصيرة حيث تقييم الحالة

وهي تفعل ذلك عندما تشعر بذلك ، ولكن ليس بالطريقة التي تفكر بها على الفور.

بصفتك مطورًا ، يجب أن تدرك أن SQL Server لا يقوم بعمل دائرة قصر كما هو الحال في لغات البرمجة الأخرى و لا يوجد شيء يمكنك القيام به لإجباره على .

لمزيد من التفاصيل ، تحقق من الرابط الأول في إدخال المدونة أعلاه ، والذي يؤدي إلى مدونة أخرى:

هل SQL Server Short-Circuit؟

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

27
MicSim

في T-SQL ، يمكن أن تقصر العبارة IF ، ولكن لا يمكنك الاعتماد عليها في تقييم التعبيرات بالترتيب

6
Jack says try topanswers.xyz

SQL هي لغة برمجة تعريفية . على عكس ، على سبيل المثال ، لغة C++ وهي لغة برمجة ضرورية .

بمعنى آخر. يمكنك أن تقول ذلك ماذا تريد في النتيجة النهائية ، ولكن لا يمكنك أن تملي كيف يتم تنفيذ النتيجة ، كل ذلك متروك للمحرك.

الطريقة الحقيقية الوحيدة لضمان "دائرة قصر" (أو أي تدفق تحكم آخر ) داخل WHERE هي استخدام طرق عرض مفهرسة ، مؤقتة الجداول والآليات المماثلة.

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

0
jitbit