کاربرد دستور OPTION (RECOMPILE, OPTIMIZE FOR UNKNOWN) در SQL

دستور OPTION (RECOMPILE, OPTIMIZE FOR UNKNOWN) در SQL Server یکی از گزینه‌های Query Hint است که رفتار Optimizer رو روی اجرای یک کوئری خاص کنترل می‌کنه. بذار مرحله‌به‌مرحله توضیح بدم:


1. RECOMPILE

این بخش باعث می‌شود که SQL Server هر بار که کوئری اجرا می‌شود، یک Plan جدید بسازد و از Execution Plan ذخیره‌شده قبلی استفاده نکند.


چرا لازم می‌شود؟

* وقتی داده‌ها یا پراکندگی داده‌ها (Data Distribution) خیلی متغیر هستند، استفاده از Plan قبلی ممکن است کارایی ضعیفی داشته باشد.

* مخصوصاً برای کوئری‌هایی که دارای پارامتر هستند و مقادیر پارامترهای مختلف باعث تغییر شدید تعداد ردیف‌ها می‌شود.


مثال:

SELECT * 

FROM Orders 

WHERE CustomerID = @CustID

OPTION (RECOMPILE);


SQL Server هر بار که این کوئری اجرا شود، با مقدار واقعی @CustID Plan جدید می‌سازد.


2. OPTIMIZE FOR UNKNOWN

این گزینه به Optimizer می‌گوید فرض کند که هیچ اطلاعات خاصی از پارامترها ندارد و Plan را بر اساس آمار کلی جدول بسازد، نه بر اساس مقادیر واقعی پارامترها.


مزایا:

* وقتی داده‌ها خیلی نامتوازن هستند (مثلاً بعضی مقادیر پارامتر خیلی پرت هستند)، این گزینه از parameter sniffing problem جلوگیری می‌کند.

* به جای اینکه Plan برای یک مقدار خاص پارامتر بهینه شود، Planی عمومی ساخته می‌شود.


مثال:

SELECT * 

FROM Orders 

WHERE CustomerID = @CustID

OPTION (OPTIMIZE FOR UNKNOWN);


SQL Server از آماری استفاده می‌کند که برای تمام داده‌ها معتبر باشد، نه فقط مقدار @CustID.


نکته مهم:

می‌توان این دو را با هم استفاده کرد:

SELECT * 

FROM Orders 

WHERE CustomerID = @CustID

OPTION (RECOMPILE, OPTIMIZE FOR UNKNOWN);


هر بار که کوئری اجرا شود، Plan جدید ساخته می‌شود و این Plan برای مقدار واقعی پارامتر بهینه نمی‌شود بلکه برای "مقدار ناشناخته" بهینه‌سازی می‌شود.

بکاپ از درایورها

ابتدا PowerShell را با کاربری administrator اجرا کنید

درستور زیر را تایپ و اجرا کنید:

dism /online /export-driver /destination:C:\DriverBackup


پوشه ی DriverBackup را در هر مسیری که تمایل دارید ایجاد کنید.