اولویت بندی های نوع داده در SQL Server

مشکل:

من یک کوئری روی یک جدول بزرگ اجرا کردم که زمان زیادی برای اجرای آن سپری شد.ستونی که در داخل عبارت where تعریف شده است حاوی index می باشد و نیز ستون مورد جستجو در قالب یک تابع تعریف نشده است .به نظر می رسد که Optimizer از وجود index بی اطلاع می باشد.  اما مشکل ایجاد شده  در تآخیر روند اجرای کوئری به چه صورت است؟

راه حل:

این مشکل ممکن است زمانی رخ دهد که پارامتر مورد جستجو کوئری  که در stored procedure تعریف شده است از لحاظ نوع داده با ستونی از جدول که توسط کوئری مورد بررسی واقع می شود ، تفاوت دارد. در چنین مواقعی sql server پارامتر با اولویت های پایین تر به اولویت بالاتر تغییر می دهد تا به کوئری مورد نظر به شکلی مطلوب پاسخ داده شود.در ادامه به ۲مثال توجه نمایید.در مثال اول می خواهیم با کمک Account Number مربوط به هر مشتری بر روی جدول sales.customer کوئری مورد نظر خود را اجرا نماییم. AccountNumber  از نوع varchar(10) می باشد که برای آن index در نظر گرفته شده است.  در قسمت execution plan می توانیم نتایج حاصل از جستجوی index بر روی AccountNumber را مشاهده نماییم.

در ادامه نوع داده ی پارامتر AccountNumber را از varchar  به nvarchar  تغییر می دهیم و procedure و execution plan  را مجددا اجرا می کنیم.

در execution plan  خروجی حاصل از جستجو با استفاده از index را مشاهده می کنیم:

همان طور که می بینیم با اجرای عملگر فیلتر، نوع داده ی ستون  AccountNumber برای هماهنگی با پارامتر جستجو از varchar اولویت پایین به nvarchar با اولویت بالاتر تغییر می کند تا index  تعریف شده بر روی ستون AccountNumber تاثیر گذار باشد.

اکنون حالتی را در نظر می گیریم که پارامتر جستجو به لحاظ نوع داده ای  اولویت پایین تری نسبت به ستون مورد نظر ما داشته باشد. در جدول Person.Person ستون LastName حاوی نوع داده ای از نوع nvarchar می باشد. همچنین  در کوئری جستجو procedure ، متغیر مورد نظر یعنی LastName@ را از نوع varchar  تعریف می کنیم.

در execution plan  خروجی حاصل از تعریف چنین نوع داده ای و نیز بهره گیری از index توسط optimizer  را داریم:

برای درک بیشتر تبدیل نوع داده ای جستجو که مقداری مخالف با نوع داده ای ستون LastName    که از نوع nvarchar است را داریم:

به دلیل اینکه ستون حاوی  index تغییر نمی کند، optimizer  امکان انتخاب optimal plan  دلخواه را خواهد داشت.

هنگامی که پارامترهای جستجو  در منطق برنامه نویسی و یا stored procedure تعریف می شوند با نوع داده ی ستون مورد نظر از جدول مطابقت داشته باشد، مشکلات تبدیل نوع داده ی پارامتر ها به یکدیگر و نیز  مشکلات مربوط به جستجوی index  انتخابی را نخواهیم داشت.

1 پاسخ
  1. حسن ضرابی
    حسن ضرابی گفته:

    با سلام و خسته نباشید خدمت شما
    از این مقاله بسیار عالیتون واقعا ممنونم لطف کردید
    از سایت بسیار عالیتون واقعا ممنونم واقعا مقاله های عالی در سایت شما وجود دارد
    با تشکر از شما

    پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *