2018-06-25

تاثير استعمال Like على Performance الكويري في SQL Server

 

نفترض كويري كما بالأسفل
Select Id, FirstName, LastName,  JobDescription  From Employee where FristName Like '%hm%'

مبدأيا  يقوم SQL Server عند تنفيذ اي كويري بعمل خطة للتنفيذ Execution Plan  و تشتمل هذه الخطه على ما هي ال Indexes التى سيتم الاعتماد عليها لتنفيذ الكويري و و اي  Index او جدول سيبدأ ب احضار البيانات منخم
يبحث SQL Server  عن الجدوال و الأعمدة المستعمله فى Where Section  و Join Conditions و يري اي من هذه الأعمدة مبني عليها Index و لو كانت هناك أكثر من Index  على نفس العمود فيقوم باختيار افضل Index تساعد فى تنفيذ الكويري بشكل أفضل  فيقوم باستعمالها أثناء تنفيذ الكويري لاحضار البيانات بصورة اسرع

ال Index على عمود ما و ليكن FirstName  هو عبارة عن فهرس لتخزين كل القيم الموجودة فى العمود FirstName و تكون  هذه القيم مخزنة فى الفهرس بترتيب ابجدي.


 ففي المثال بالأعلى نجد انه يوجد شرط على عمود FirstName و بالتالى فإنه إذا كانت توجد Index  على هذا العمود فغالبا ما يستعملها  SQL Server  في تنفيذ الكويري
المشكلة هنا ان استعمال Like  بالشكل الموضح اعلاه  و هو انه يبحث عن جزء فى منتصف الكلمة يمنع استخدام Index المبنية على عمود FirstName

السبب في ذلك هو انه عند انشاء Index  فإن  الكلمات فى عمود FirstName  يتم ادخالها كما هيا فى Index  و لا يتم ادخال اجزاء منها فمثلا لو توجد كلمة Ahmed فانها ستسجل فى Index كما هي Ahmed  و لو توجد كلمة Abd ALRAHMAN  فستسجل فى Index كما هي

و بما ان ال Index  تكون مرتبة ابجديا فيمكن استعمال  Index للبحث فيها عن القيم الكاملة مخزنة فى حقل FirstName او القيم  التى تبدأ بأحرف معينة و لكن لا يمكن استعمال ال Index  للبحث عن جزء فى وسط القيم المخزنة فى حقل ما مثل FirstName لذلك يمكن استعمال Index للبحث عن كلمة مثل Ahmed h او Abd ALRAHMAN  و لكن لا يمكن استعمال Index للبحث عن ALRAHMAN وحدها لأنها ليست بداية النص المكتوب فى حقل FirstName



و لكن يمكن استعمال   Index للبحث عن بداية  النص ف حق ما فمثلا يمكن استعمالها للبحث عن الكلمات التى تبدأ ب A او Ah او   Abd و هكذا عن طريقة كتابة
 
Like 'A%'
Like 'Ah%'
Like 'Abd%'
و في هذه الحاله سيتمكن SQL Server من استعمال Index للبحث عن بداية النصوص ال Index تكون مرتبة ابجديا فيسهل استعمال Index لاختبار النصوص اعتبارا من بدايتها

لذلك لا يحبذ استعمال Like  الا لو تم الاستغناء عن WildCards في بداية النص بعد Like
كما يلي
  1. Like 'Ahm%'
     هنا  لا يحتوي بداية النص بعد Like على اى علامات Percentage او Wild cards  لذلك فهذه تسمح باستعمال Index

  2. Like '%Ahm%'
     هنا  يحتوي في بداية النص بعد Like على اى علامات Percentage او Wild cards  لذلك فهذه  لا تسمح باستعمال Index

  3. Like 'Ah%'
     هنا  لا يحتوي بداية النص بعد Like على اى علامات Percentage او Wild cards  لذلك فهذه تسمح باستعمال Index


    هذا لا يعني ان الكويري بالأعلى  لن يتمكن من ايجاد الكلمات التى تحتوي في منتصفها لى  "hm" و لكنه سياخذ وقت طويل لأنه لن يتمكن من استعمال Index بمعني انه سيتطلب فحص كل القيم الموجودة فى كل الصفوف فى حقل FirstName  و هذا بالطبع سياخذ وقت اطول . و يزيد هذا الوقت كلما كانت عدد الصفوف و الأعمدة فى الجدول اكبر

    و فى النهاية في انتظار ارائكم و تعليقاتكم.

ليست هناك تعليقات:

إرسال تعليق

الموضوع المميز

تاثير استعمال Like على Performance الكويري في SQL Server

  نفترض كويري كما بالأسفل Select Id, FirstName, LastName,  JobDescription  From Employee where FristName Like '%hm%'

أكثر المواضيع زيارة