به طور معمول، وقتی SQL Server آمار (Statistics) یک جدول را به روزرسانی می کند، پلن های اجرایی کش شده ای که به آن آمار وابسته اند باطل می شوند و در اجرای بعدی، پلن جدید ساخته می شود. این رفتار کاملاً منطقی است، چون داده ها تغییر کرده اند و SQL Server باید تصمیم گیری جدیدی انجام دهد. اما…
یک استثنای عجیب و کمتر شناخته شده وجود دارد:
اگر آمار به صورت خودکار توسط SQL Server ساخته شده باشد (یعنی همان _WA_Sys ها)، حتی اگر این آمار بعداً با FULLSCAN به روزرسانی شود:
- پلن قبلی invalidate نمی شود
- کوئری دوباره کامپایل نمی شود
- SQL Server همچنان از تخمین های قدیمی استفاده می کند
اما دلیلش چیست؟
این آمار سیستمی (Auto-created) است و SQL Server برای این نوع آمارها recompile خودکار انجام نمی دهد.
تنها راه:
- اجرای دستور EXEC sp_recompile TableName
- پاک شدن Plan Cache.
آیا این موضوع در عمل خطرناک است؟
تقریباً نه. چون:
- معمولاً آمار مهم روی ایندکس ها هستند، نه آمار سیستمی
- Plan Cache در سیستم های واقعی مدام در حال تغییر است
- Recompile زیاد هم خودش مشکل زاست
پس SQL Server عمداً در اینجا محافظه کارانه عمل می کند.
سید حامد واحدی
8 بهمن 1404