سؤال

لدينا مجموعة كاملة من الاستعلامات التي "تبحث" عن العملاء والعملاء وما إلى ذلك.يمكنك البحث بالاسم الأول والبريد الإلكتروني وما إلى ذلك.نحن نستخدم عبارات LIKE بالطريقة التالية:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

هل تساعد فهرسة النص الكامل في السيناريو؟نحن نستخدم SQL Server 2005.

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

المحلول

سوف يعتمد على نظام إدارة قواعد البيانات (DBMS) الخاص بك.أعتقد أن معظم الأنظمة لن تستفيد من فهرس النص الكامل إلا إذا استخدمت وظائف النص الكامل.(على سبيل المثال مباراة ضد في MySQL أو FREETEXT/CONTAINS في MS SQL)

إليك مقالة جيدة حول متى ولماذا وكيفية استخدام فهرسة النص الكامل في SQL Server: فهم فهرسة النص الكامل لـ SQL Server

نصائح أخرى

فتس يستطيع مساعدة في هذا السيناريو، والسؤال هو ما إذا كان الأمر يستحق ذلك أم لا.

في البداية، دعونا ننظر إلى السبب LIKE قد لا يكون البحث الأكثر فعالية.عندما تستخدم LIKE, ، خاصة عند البحث باستخدام ملف % في بداية المقارنة، يحتاج SQL Server إلى إجراء فحص جدول لكل صف على حدة و فحص بايت بايت للعمود الذي تقوم بفحصه.

لدى FTS بعض الخوارزميات الأفضل لمطابقة البيانات كما هو الحال مع بعض الإحصائيات الأفضل حول الأشكال المختلفة للأسماء.وبالتالي يمكن أن يوفر FTS أداءً أفضل لمطابقة Smith وSmythe وSmithers وما إلى ذلك عندما تبحث عن Smith.

ومع ذلك، يعد استخدام FTS أكثر تعقيدًا بعض الشيء، حيث ستحتاج إلى إتقانه CONTAINS ضد FREETEXT والشكل الغامض للبحث.ومع ذلك، إذا كنت تريد إجراء بحث حيث يتطابق FName أو LName، فيمكنك إجراء ذلك باستخدام عبارة واحدة بدلاً من OR.

لتحديد ما إذا كانت خدمة FTS ستكون فعالة، حدد مقدار البيانات المتوفرة لديك.أستخدم FTS في قاعدة بيانات تضم مئات الملايين من الصفوف، وهذه فائدة حقيقية مقارنة بالبحث باستخدامها LIKE, لكني لا أستخدمه على كل طاولة.

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

وفقًا لسيناريو الاختبار الخاص بي:

  • SQL خادم 2008
  • 10.000.000 صفوف لكل منها سلسلة مثل "Worda WordB WordC ..." (تختلف بين 1 و 30 كلمة)
  • تحديد العد (*) مع CONTAINS (عمود، "wordB")
  • حجم النتيجة عدة مئات الآلاف
  • حجم الكتالوج 1.8 جيجا تقريبا

كان فهرس النص الكامل في نطاق 2 ثانية بينما مثل '% wordB %' كان في حدود 1-2 دقيقة.

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

لذلك أوصي بفهرس النص الكامل فقط في الحالات التي يتعين عليك فيها إجراء "بحث مجاني عن السلسلة" أو استخدام بعض الميزات الخاصة به...

للإجابة على السؤال المخصص لـ MSSQL، سيتم إجراء فهرسة النص الكامل لا مساعدة في السيناريو الخاص بك.

لتحسين هذا الاستعلام، يمكنك القيام بأحد الإجراءات التالية:

  1. قم بتكوين كتالوج نص كامل في العمود واستخدم الدالة CONTAINS().
  2. إذا كنت تبحث بشكل أساسي باستخدام بادئة (أيمطابقة من بداية الاسم)، يمكنك تغيير المسند إلى ما يلي وإنشاء فهرس فوق العمود.

    حيث fname مثل "البادئة٪"

(1) ربما يكون هذا مبالغة في هذا الأمر، إلا إذا كان أداء الاستعلام يمثل مشكلة كبيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top