خانه SQL Server مشکل Parameter Sniffing در SQL Server 2022 SQL Server افزایش سرعت SQL Server نوشته شده توسط: مهدی قپانوری تاریخ انتشار: ۱۱ خرداد ۱۴۰۱ آخرین بروزرسانی: 10 آذر 1403 زمان مطالعه: 5 دقیقه ۵ (۲) Parameter Sniffing در SQL Server، چرا اجرای یک Stored Procedure گاهی کند و گاهی سریع است؟ Plan اجرائی یک پروسیجر به ازای اولین مقداری که به پروسیجر پاس داده می شود تشکیل و در اجرای های بعدی مورد استفاده قرار می گیرد. این موضوع می تواند منجر به مشکل Parameter Sniffing شود. در این مقاله قصد داریم با ایجاد یک مثال به بررسی مشکل Parameter Sniffing بپردازیم. پیشنهاد میکنیم برای درک بهتر مفاهیم آموزش جامع SQL Server را مطالعه کنید. بررسی مشکل Parameter Sniffing ابتدا یک Index در جدول Users در دیتابیس StackOverflow بر روی ستون Reputation ایجاد می نمائیم: تقریبا ۶ میلیون رکورد در جدول Users وجود دارد که Reputation آن ها برابر با یک است اما SQL Server این حجم از رکورد را تنها با یک CPU Core پردازش می نماید!چرا که Plan به ازای تقریبا ۹ هزار رکورد تشکیل شده است و در Plan Cache قرار گرفته و از همان Plan در اجراهای بعدی استفاده می شود. پیشنهاد میکنیم برای درک بهتر مفاهیم دوره کوئری نویسی پیشرفته را مطالعه کنید. این مشکل، Parameter Sniffing است. راه های زیادی جهت حل این مشکل وجود دارد که جدید ترین آنها افزایش سطح سازگاری دیتابیس به ۱۶۰ می باشد. دستور زیر سطح سازگاری دیتابیس Stack Overflow را به ۱۶۰ افزایش می دهد: Alter Database StackOverflow Set Compatibility_Level = 160 یک بار دیگر پروسیجر را به ازای مقدار ورودی ۲ اجرا می نمائیم، تصویر زیر نشان می دهد که Plan اجرائی پروسیجر به شکل سریال است: دوباره مقدار یک را به پروسیجر پاس می دهیم، تصویر زیر را مشاهده نمائید: Plan اجرایی به شکل موازی است. (در این نمونه خطوط زرد رنگ نشان دهنده اجرا به صورت Parallel می باشد) یعنی SQL Server تشخیص داد که به ازای مقدار ورودی ۱ تعداد بسیار زیادی رکورد باید پردازش شود و از چندین CPU Core جهت اجرای پروسیجر استفاده نمود. سخن پایانی Parameter Sniffing در SQL Server، در پایان این سوال ایجاد می شود که: آیا در SQL Server 2022 مشکل Parameter Sniffing کامل برطرف شده است؟ نمونه های زیادی از مشکل Parameter Sniffing وجود دارد، مثال فوق فقط یک نمونه بود. همه نمونه های این مشکل باید با SQL Server 2022 تست شود و مشاهده گردد که، کدام یک از آن ها برطرف شده و چه نمونه هایی از این مشکل هنوز هم وجود دارد. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم. تقریبا ۶ میلیون رکورد در جدول Users وجود دارد که Reputation آن ها برابر با یک است اما SQL Server این حجم از رکورد را تنها با یک CPU Core پردازش می نماید!چرا که Plan به ازای تقریبا ۹ هزار رکورد تشکیل شده است و در Plan Cache قرار گرفته و از همان Plan در اجراهای بعدی استفاده می شود. پیشنهاد میکنیم برای درک بهتر مفاهیم دوره کوئری نویسی پیشرفته را مطالعه کنید. این مشکل، Parameter Sniffing است. راه های زیادی جهت حل این مشکل وجود دارد که جدید ترین آنها افزایش سطح سازگاری دیتابیس به ۱۶۰ می باشد. دستور زیر سطح سازگاری دیتابیس Stack Overflow را به ۱۶۰ افزایش می دهد: Alter Database StackOverflow Set Compatibility_Level = 160 یک بار دیگر پروسیجر را به ازای مقدار ورودی ۲ اجرا می نمائیم، تصویر زیر نشان می دهد که Plan اجرائی پروسیجر به شکل سریال است: دوباره مقدار یک را به پروسیجر پاس می دهیم، تصویر زیر را مشاهده نمائید: Plan اجرایی به شکل موازی است. (در این نمونه خطوط زرد رنگ نشان دهنده اجرا به صورت Parallel می باشد) یعنی SQL Server تشخیص داد که به ازای مقدار ورودی ۱ تعداد بسیار زیادی رکورد باید پردازش شود و از چندین CPU Core جهت اجرای پروسیجر استفاده نمود. سخن پایانی Parameter Sniffing در SQL Server، در پایان این سوال ایجاد می شود که: آیا در SQL Server 2022 مشکل Parameter Sniffing کامل برطرف شده است؟ نمونه های زیادی از مشکل Parameter Sniffing وجود دارد، مثال فوق فقط یک نمونه بود. همه نمونه های این مشکل باید با SQL Server 2022 تست شود و مشاهده گردد که، کدام یک از آن ها برطرف شده و چه نمونه هایی از این مشکل هنوز هم وجود دارد. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم. اجرا به صورت سریال یعنی SQL Server از یک CPU Core جهت اجرای Procedure استفاده نموده است. زیرا که تعداد رکوردهای پردازشی کم بوده است. به ازای مقدار ورودی ۲ تنها ۹۱۴۹ رکورد پردازش شده است. این Plan اجرائی که به صورت سریال است در Plan Cache قرار می گیرد و جهت اجراهای بعدی پروسیجر استفاده می شود. یعنی Plan اجرائی پروسیجر به ازای اولین مقداری که اصطلاحا به پروسیجر پاس داده می شود تشکیل و در اجرای های بعدی مورد استفاده قرار می گیرد. حالا اگر مقدار یک را به پروسیجر پاس دهیم چه اتفاقی می افتد؟ همان Plan که به شکل سریال است مورد استفاده قرار می گیرد. تصویر زیر این موضوع را نشان می دهد: تقریبا ۶ میلیون رکورد در جدول Users وجود دارد که Reputation آن ها برابر با یک است اما SQL Server این حجم از رکورد را تنها با یک CPU Core پردازش می نماید!چرا که Plan به ازای تقریبا ۹ هزار رکورد تشکیل شده است و در Plan Cache قرار گرفته و از همان Plan در اجراهای بعدی استفاده می شود. پیشنهاد میکنیم برای درک بهتر مفاهیم دوره کوئری نویسی پیشرفته را مطالعه کنید. این مشکل، Parameter Sniffing است. راه های زیادی جهت حل این مشکل وجود دارد که جدید ترین آنها افزایش سطح سازگاری دیتابیس به ۱۶۰ می باشد. دستور زیر سطح سازگاری دیتابیس Stack Overflow را به ۱۶۰ افزایش می دهد: Alter Database StackOverflow Set Compatibility_Level = 160 یک بار دیگر پروسیجر را به ازای مقدار ورودی ۲ اجرا می نمائیم، تصویر زیر نشان می دهد که Plan اجرائی پروسیجر به شکل سریال است: دوباره مقدار یک را به پروسیجر پاس می دهیم، تصویر زیر را مشاهده نمائید: Plan اجرایی به شکل موازی است. (در این نمونه خطوط زرد رنگ نشان دهنده اجرا به صورت Parallel می باشد) یعنی SQL Server تشخیص داد که به ازای مقدار ورودی ۱ تعداد بسیار زیادی رکورد باید پردازش شود و از چندین CPU Core جهت اجرای پروسیجر استفاده نمود. سخن پایانی Parameter Sniffing در SQL Server، در پایان این سوال ایجاد می شود که: آیا در SQL Server 2022 مشکل Parameter Sniffing کامل برطرف شده است؟ نمونه های زیادی از مشکل Parameter Sniffing وجود دارد، مثال فوق فقط یک نمونه بود. همه نمونه های این مشکل باید با SQL Server 2022 تست شود و مشاهده گردد که، کدام یک از آن ها برطرف شده و چه نمونه هایی از این مشکل هنوز هم وجود دارد. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم. Create Index IXNCReputation On dbo.Users (Reputation) سطح سازگاری دیتابیس را برابر با ۱۵۰ قرار می دهیم: Alter Database StackOverflow Set Compatibility_Level = 150 و پروسیجر زیر را ایجاد می نمائیم: Create Procedure USP_GetReputationCount (@Reputation Int) As Select Count(Reputation) As ReputationCount From dbo.Users Where Reputation = @Reputation همان طور که در تصویر زیر مشاهده می نمائید Plan اجرائی پروسیجر به ازای مقدار ورودی ۲ به صورت سریال است: اجرا به صورت سریال یعنی SQL Server از یک CPU Core جهت اجرای Procedure استفاده نموده است. زیرا که تعداد رکوردهای پردازشی کم بوده است. به ازای مقدار ورودی ۲ تنها ۹۱۴۹ رکورد پردازش شده است. این Plan اجرائی که به صورت سریال است در Plan Cache قرار می گیرد و جهت اجراهای بعدی پروسیجر استفاده می شود. یعنی Plan اجرائی پروسیجر به ازای اولین مقداری که اصطلاحا به پروسیجر پاس داده می شود تشکیل و در اجرای های بعدی مورد استفاده قرار می گیرد. حالا اگر مقدار یک را به پروسیجر پاس دهیم چه اتفاقی می افتد؟ همان Plan که به شکل سریال است مورد استفاده قرار می گیرد. تصویر زیر این موضوع را نشان می دهد: تقریبا ۶ میلیون رکورد در جدول Users وجود دارد که Reputation آن ها برابر با یک است اما SQL Server این حجم از رکورد را تنها با یک CPU Core پردازش می نماید!چرا که Plan به ازای تقریبا ۹ هزار رکورد تشکیل شده است و در Plan Cache قرار گرفته و از همان Plan در اجراهای بعدی استفاده می شود. پیشنهاد میکنیم برای درک بهتر مفاهیم دوره کوئری نویسی پیشرفته را مطالعه کنید. این مشکل، Parameter Sniffing است. راه های زیادی جهت حل این مشکل وجود دارد که جدید ترین آنها افزایش سطح سازگاری دیتابیس به ۱۶۰ می باشد. دستور زیر سطح سازگاری دیتابیس Stack Overflow را به ۱۶۰ افزایش می دهد: Alter Database StackOverflow Set Compatibility_Level = 160 یک بار دیگر پروسیجر را به ازای مقدار ورودی ۲ اجرا می نمائیم، تصویر زیر نشان می دهد که Plan اجرائی پروسیجر به شکل سریال است: دوباره مقدار یک را به پروسیجر پاس می دهیم، تصویر زیر را مشاهده نمائید: Plan اجرایی به شکل موازی است. (در این نمونه خطوط زرد رنگ نشان دهنده اجرا به صورت Parallel می باشد) یعنی SQL Server تشخیص داد که به ازای مقدار ورودی ۱ تعداد بسیار زیادی رکورد باید پردازش شود و از چندین CPU Core جهت اجرای پروسیجر استفاده نمود. سخن پایانی Parameter Sniffing در SQL Server، در پایان این سوال ایجاد می شود که: آیا در SQL Server 2022 مشکل Parameter Sniffing کامل برطرف شده است؟ نمونه های زیادی از مشکل Parameter Sniffing وجود دارد، مثال فوق فقط یک نمونه بود. همه نمونه های این مشکل باید با SQL Server 2022 تست شود و مشاهده گردد که، کدام یک از آن ها برطرف شده و چه نمونه هایی از این مشکل هنوز هم وجود دارد. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم. چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۲ اولین نفر باش دانلود مقاله مشکل Parameter Sniffing در SQL Server 2022 فرمت PDF 4 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 15 مقاله توسط این نویسنده محصولات 1 دوره توسط این نویسنده مهدی قپانوری مهدی قپانوری بیش از 6 سال است که در زمینههای نرم افزار و بانک اطلاعاتی فعالیت مینماید. تخصص اصلی او در بانک اطلاعاتی SQL Server بوده و دارای تجربه در حوزههایPerformance Tuning، Database Administration، Database Development و طراحی سیستمهای OLTP میباشد. مهدی علاقهمند به R&D در حوزههای نوین SQL Server است. معرفی محصول مسعود طاهری دوره ۳ در ۱ آموزش performance tuning در SQL Server 6.700.000 تومان 4.020.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ مسعود ۰۸ / ۰۴ / ۰۱ - ۰۹:۲۰ عالی و مفید پاسخ به دیدگاه محمدرضا خلیل زاده ۰۳ / ۰۴ / ۰۱ - ۰۹:۲۱ همکار عزیزم خیلی ممنون بابت مقاله ارزشمندت، میتونید نمونه های بیشتری مثال بزنید؟ پاسخ به دیدگاه عباس ۱۱ / ۰۳ / ۰۱ - ۰۳:۳۲ ممنون بابت مطالب آموزنده ، کاربردی و ارزنده پاسخ به دیدگاه