سؤال

لدينا استعلام الذي يمتد خارج جدول كبير إلى حد ما يحتاج للأسف لاستخدام LIKE '٪ ABC٪' على حقول زوجين VARCHAR بحيث يمكن للمستخدم البحث عن أسماء جزئية، الخ SQL خادم 2005

هل إضافة فهرس على هذه الحقول VARCHAR مساعدة أي من حيث الأداء استعلام تحديد عند استخدام مثل أم أنه تجاهل أساسا المؤشرات والقيام مسح كامل في تلك الحالات؟

وأي وسائل أخرى مناسبة لتحسين الأداء عند استخدام مثل؟

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

المحلول

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

وإلا، لا، مؤشر لن يساعد.

نصائح أخرى

وأنت من المحتمل أن نرى تحسينات الأداء بإضافة مؤشر (الخانات)، وذلك يعتمد كثيرا على التفاصيل:)

وكم من الحجم الإجمالي للصف هي الأعمدة تستند؟ عدد الصفوف تتوقع لمباراة؟ هل تحتاج إلى إعادة جميع الصفوف التي تطابق المسند، أو مجرد أعلى 1 أو أعلى ن الصفوف؟

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

وهنا مثال حيث إجمالي حجم صف أكبر بكثير من حجم عمود للبحث في:

create table t1 (v1 varchar(100), b1 varbinary(8000))
go
--add 10k rows of filler
insert t1 values ('abc123def', cast(replicate('a', 8000) as varbinary(8000)))
go 10000
--add 1 row to find
insert t1 values ('abc456def', cast(replicate('a', 8000) as varbinary(8000)))
go

set statistics io on 
go
select * from t1 where v1 like '%456%'
--shows 10001 logical reads

--create index that only contains the column(s) to search across
create index t1i1 on t1(v1)
go
select * from t1 where v1 like '%456%'
--or can force to 
--shows 37 logical reads

إذا نظرتم الى خطة التنفيذ الفعلية تستطيع أن ترى في محرك مسح مؤشر وقام المرجعية بحث في الصف مطابقة. أو يمكنك أن تقول للمحسن مباشرة لاستخدام الفهرس، لو لم تقرر استخدام هذه الخطة من تلقاء نفسها: حدد * من t1 مع (مؤشر (t1i1)) حيث V1 مثل '٪ 456٪'

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

إذا كنت بحاجة دائما للعودة مجموعة كبيرة من الصفوف التي سيكون من شبه المؤكد أفضل حالا مع مسح الطاولة.

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

وHTH! -Adrian

والطريقة الوحيدة الأخرى (بخلاف استخدام الفهرسة نص كامل) التي يمكن أن تحسن الأداء في استخدام "مثل ABC٪" - لا تضيف البدل على طرفي المصطلح المطلوب - في هذه الحالة، يمكن للمؤشر العمل.

إذا متطلباتك هي تلك التي يكون لديك البدل على طرفي مصطلح البحث، وكنت من الحظ ...

ومارك

ومثل '٪ ABC٪' سوف تؤدي دائما تفحص الجدول الكامل. لا توجد وسيلة حول ذلك.

وأنت لديك بضع النهج البديلة. أولا البحث عن النص الكامل، انها مصممة حقا لهذا النوع من المشاكل لذلك أود أن ننظر في ذلك لأول مرة.

وبدلا من ذلك في بعض الحالات قد يكون من المناسب لإلغاء تطبيع البيانات وقبل عملية المجالات المستهدفة إلى الرموز المناسبة، ثم إضافة هذه مصطلحات البحث المحتملة في منفصلة واحدة للعديد من الجدول البحث. على سبيل المثال، إذا تألف البيانات الخاصة بي دائما من الحقل الذي يحتوي على نمط "AAA / BBB / CCC" والمستخدمين بلدي كانوا يبحثون عن BBB ثم كنت tokenize أن الخروج على إدراج / تحديث (وإزالة على حذف). وهذا من شأنه أيضا أن تكون واحدة من تلك الحالات التي يكون فيها استخدام المشغلات، بدلا من تطبيق القانون، سيكون <م> كثير المفضل.

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

وإنشاء إحصاءات عن هذا العمود. وقد الأمثل مزود خدمة 2005 في سلسلة البحث حتى أنك قد تستفيد من ذلك.

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