دستور 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 را در هر مسیری که تمایل دارید ایجاد کنید.