كيف يمكنك البحث عن النص الكامل معايير متعددة على اليسار الجداول في SQL Server?

StackOverflow https://stackoverflow.com/questions/35954

  •  09-06-2019
  •  | 
  •  

سؤال

لدي استفسار أصلا يبدو مثل هذا:

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

على قاعدة البيانات مع 90,000 سجلات هذا الاستعلام يستغرق حوالي 7 ثوان من تنفيذ (ومن الواضح أن كل من ينضم ويحب يتم فرض ضرائب).

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

هل هناك طريقة للقيام بذلك في النص الكامل البحث ؟


@ديفيد

نعم ، هناك مؤشرات على معرفات.

لقد حاولت إضافة فهارس على CustomerAddress الاشياء (CityName, الرمز البريدي, الخ.) و جاء الاستعلام إلى 3 ثوان, ولكن أنا لا تزال تجد أن بطيئة جدا عن شيء مثل هذا.

لاحظ أن جميع حقول النص (مع استثناء من معرفات) هي nvarchars ، Line1 هو nvarchar 1000 ، بحيث قد تؤثر على سرعة, ولكن لا يزال.

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

المحلول

تشغيل من خلال "محلل استعلام" وانظر ما الاستعلام الخطة.تخميني هو أن جذر مزدوج (أي.%ae%) البحث مما تفعل مسح الطاولة عندما تبحث عن مطابقة الصفوف.ضعف الجذر البحث بطبيعتها بطيئة ، كما لا يمكنك استخدام أي نوع من مؤشر مباراة لهم عادة.

نصائح أخرى

ملاحظة:هذا ليس جوابا ، مجرد محاولة توضيح ما قد يكون في الواقع تسبب مشاكل الأداء(s).

90,000 السجلات هي حقا صغيرة إلى حد ما مجموعة البيانات و الاستعلام هو بسيط نسبيا مع اثنين فقط من الانضمام.هل لديك مؤشرات على CustomerAddress."معرف العميل" و CustomerAccount."معرف العميل"?الذي يبدو أكثر احتمالا أن تسبب مشكلات في الأداء من حيث الشرط مثل المسندات.هل أنت عادة البحث للعثور على تطابق كل من هذه الأعمدة في نفس الوقت ؟

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

واحد سريع التحقق من أن الوقت مجرد جزء من الاستعلام التي تنطوي على نص البحث.شيء من هذا القبيل:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

إذا كان هذا وقتا طويلا ، ثم LIKEs هي مسألة (إزالة تعبير واحد في كل مرة من ORإد الخط لمعرفة إذا كان واحد فقط من هذه الأعمدة هي التي تسبب تباطؤ).إذا كان سريع ، ثم ينضم هي المشتبه به.

يمكن أن تكتب مماثلة الاستعلام عن CustomerAccount الجدول أيضا.

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