
في بعض الأحيان يمكن إصلاح الاستعلامات البطيئة عن طريق تعديل الاستعلام قليلاً. يمكن توضيح أحد هذه الأمثلة عند مقارنة قيم متعددة في جملة WHERE باستخدام عامل التشغيل OR أو IN. غالبًا ما يمكن أن يتسبب OR في مسح فهرس أو جدول ، وهو ما قد لا يكون خطة التنفيذ المفضلة من حيث استهلاك I / O أو سرعة الاستعلام الإجمالية.
تدخل العديد من المتغيرات في الاعتبار عندما يقوم مُحسِّن الاستعلام بإنشاء خطة تنفيذ. تتضمن هذه المتغيرات العديد من خصائص الأجهزة ، وإعدادات المثيل ، وإعدادات قاعدة البيانات ، والإحصائيات (الجدول ، الفهرس ، الإنشاء التلقائي) ، بالإضافة إلى طريقة لكتابة استعلام. هنا نغير الطريقة التي نكتب بها الطلب. بغض النظر عن مدى قد يبدو هذا غير متوقع ، حتى إذا كان باستطاعة استعلامين مختلفين عرض النتائج نفسها ، فقد يكون المسار الذي يتبعونه مختلفًا تمامًا اعتمادًا على تنسيق الاستعلام.
الاتحاد مقابل أو
بالنسبة لمعظم تجربتي مع SQL Server ، OR عادةً ما يكون أقل كفاءة من UNION. ما يحدث عادةً مع OR هو أنه يتسبب في الغالب في الفحص. قد يكون هذا في بعض الأحيان هو أفضل طريقة لبعض الحالات ، وسأتركها كمقال منفصل ، لكن بشكل عام وجدت أنه عندما يتأثر عدد كبير من الإدخالات ، فهذا هو السبب الرئيسي للبطء. لذلك دعونا نبدأ المقارنة.
هنا بياننا OR:
SELECT SalesOrderID, * FROM sales.SalesOrderDetail WHERE ProductID = 750 OR ProductID = 953

من خطة التنفيذ هذه ، نرى أننا نقوم بمسح 121000 صف. (لا يمكنك رؤية عدد الصفوف ، لكنه).
ننفذ الآن نفس الاستعلام ، لكننا كتبنا باستخدام UNION بدلاً من OR:
SELECT [SalesOrderID], * FROM sales.SalesOrderDetail WHERE ProductID = 750 UNION SELECT [SalesOrderID], * FROM sales.SalesOrderDetail WHERE ProductID = 953

هنا نرى فرعين من العمليات. يؤثر أحد الفروع على 358 خطًا و 346 خطًا آخر. تم العثور على كلا الفرعين لإجراء عملية تسلسل تجمع بين مجموعتي النتائج. لدينا بحثان منفصلان ، ولكن لدينا أيضًا مفتاح بحث للحصول على قائمة SELECT المطلوبة. لم يكن هذا ضروريًا لعملية المسح ، لأننا ما زلنا نتأثر بجميع الخطوط في عملية المسح ، لذلك تم الحصول على البيانات أثناء الفحص وليس بعده. هذا بسبب الفهرس والصفوف التي نحتاجها ، وليس إلى الاتحاد أو OR. ومع ذلك ، سأقول إن الاختيار هو أيضًا عامل في اختيار البحث مقابل المسح ، لكننا سنتجاهل هذا في هذه المقالة.
تفسير
لماذا تسبب UNION في إجراء المزيد من عمليات البحث بدلاً من عمليات الفحص ، لأن كل عملية يجب أن تفي بمتطلبات انتقائية معينة من أجل التأهل لعملية بحث. (الانتقائية هي تفرد عمود معين تمت تصفيته). يحدث OR في عملية واحدة ، لذلك عندما يتم الجمع بين الانتقائية لكل عمود وتتجاوز نسبة مئوية معينة ، فإن المسح يعتبر أكثر كفاءة.
نظرًا لأن UNION تقوم بعملية منفصلة لكل عامل افتراضيًا ، فلن يتم الجمع بين انتقائية كل عمود ، مما يمنحه فرصة أفضل لإجراء بحث. الآن ، نظرًا لأن UNION تنفذ عمليتين ، يجب أن تتطابق مع مجموعات النتائج الخاصة بهم باستخدام عملية التسلسل الموضحة أعلاه. هذه ليست عادة عملية مكلفة.
تجدر الإشارة أيضًا إلى أن جملة OR تعمل بنفس طريقة العبارة IN.
نأمل أن يساعد هذا الطرف. أعتقد أن هذا مفيد جدًا عند التعامل مع الأنظمة التي تتطلب التزامن العالي.