نفترض كويري كما بالأسفل
مبدأيا يقوم 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 'Ah%'
Like 'Abd%'
لذلك لا يحبذ استعمال Like الا لو تم الاستغناء عن WildCards في بداية النص بعد Like
كما يلي
- Like 'Ahm%'هنا لا يحتوي بداية النص بعد Like على اى علامات Percentage او Wild cards لذلك فهذه تسمح باستعمال Index
- Like '%Ahm%'هنا يحتوي في بداية النص بعد Like على اى علامات Percentage او Wild cards لذلك فهذه لا تسمح باستعمال Index
-
Like 'Ah%'هنا لا يحتوي بداية النص بعد Like على اى علامات Percentage او Wild cards لذلك فهذه تسمح باستعمال Index
هذا لا يعني ان الكويري بالأعلى لن يتمكن من ايجاد الكلمات التى تحتوي في منتصفها لى "hm" و لكنه سياخذ وقت طويل لأنه لن يتمكن من استعمال Index بمعني انه سيتطلب فحص كل القيم الموجودة فى كل الصفوف فى حقل FirstName و هذا بالطبع سياخذ وقت اطول . و يزيد هذا الوقت كلما كانت عدد الصفوف و الأعمدة فى الجدول اكبر
و فى النهاية في انتظار ارائكم و تعليقاتكم.
ليست هناك تعليقات:
إرسال تعليق