سؤال

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

لنفترض أن لدي الجدول التالي:

dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)

افترض أن هذا الجدول يحتوي على ملايين الصفوف ، ولكن العمود فقط Company لديه فهرس.

أريد معرفة ما إذا كان مزيج معين من FirstName, LastName و Company موجود. أعلم أنني أستطيع القيام بهذا:

IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End

ومع ذلك ، ما لم أكن مخطئًا ، فإن ذلك سيقوم بإجراء فحص كامل على الطاولة.

ما أود حقًا فعله هو استعلام حيث يستخدم الفهرس. مع الجدول أعلاه ، أعلم أن الاستعلام التالي سيكون له أداء رائع ، لأنه يستخدم الفهرس:

Select * from dbo.Person where Company = @Company

هل هناك على أي حال لإجراء البحث فقط على هذه المجموعة الفرعية من البيانات؟ على سبيل المثال شيء مثل هذا:

select * from (
  Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName

وبهذه الطريقة ، فإنه لن يقوم بفحص الجدول فقط على مجموعة أضيق من البيانات.

أعلم أن الاستعلام أعلاه لن يعمل ، لكن هل هناك استعلام من شأنه؟

أوه ، وأنا غير قادر على إنشاء جداول مؤقتة ، حيث أن المستخدم لن يقرأ سوى الوصول.

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

المحلول

IF EXISTS( ...) هو أسرع شكل. سيستخدم المحسن فهرسًا متاحًا لتلبية حالة التصفية إذا كان يحسب الفهرس سيكون أسرع. IF EXISTS سوف يستقيل بمجرد العثور على صف.

تأكد من تحديث إحصائياتك ...

نصائح أخرى

FWIW ، هذا صالح SQL:

select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName

ويختلف فقط عن استعلامك عن طريق الاسم المستعار. ال IF EXISTS سيكون أسرع كما يقول ميتش في منصبه.

يمكنك استخدام محلل الاستعلام لمعرفة ما سيقرره المحسن.

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