سؤال
أحتاج إلى التحقق مما إذا كان هناك صف في قاعدة بيانات ؛ ومع ذلك ، أحاول العثور على طريقة للقيام بذلك الذي يوفر أفضل أداء. من الأفضل تلخيص هذا مثال.
لنفترض أن لدي الجدول التالي:
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
سيكون أسرع كما يقول ميتش في منصبه.
يمكنك استخدام محلل الاستعلام لمعرفة ما سيقرره المحسن.