BATCH_MODE_MEMORY_GRANT_FEEDBACK در SQL Server | آموزش تنظیم، مثال و نکات Performance

آموزش BATCH_MODE_MEMORY_GRANT_FEEDBACK در SQL Server؛ کنترل Batch Mode Memory Grant Feedback با مثال عملی

توسط admin | گروه SQL Server | 1405/05/01

نظرات 0

کنترل Batch Mode Memory Grant Feedback؛ آموزش کامل BATCH_MODE_MEMORY_GRANT_FEEDBACK در SQL Server

مشکل Memory Grant فقط کمبود RAM نیست؛ یک Query می‌تواند حافظه را بیش‌ازحد بگیرد یا با Grant کم مرتب Spill کند. Feedback برای پیدا کردن تعادل در اجراهای تکراری است.

Grant بیش‌ازحد حافظه را بی‌دلیل رزرو می‌کند و Grant کم Spill به tempdb می‌سازد. Feedback در Batch Mode برای Queryهای تکرارشونده تلاش می‌کند اندازه Grant را متعادل کند. در این مقاله از Syntax و خواندن مقدار فعلی شروع می‌کنیم و بعد به سناریوی واقعی، روش اندازه‌گیری، خطاهای رایج و تصمیم Production می‌رسیم.

برای دیدن ارتباط این گزینه با سایر تنظیمات، راهنمای جامع Database Scoped Performance Configuration را هم ببینید.

تعریف و منطق فنی

اصلاح تدریجی Memory Grant Queryهای Batch Mode با استفاده از تجربه اجراهای قبلی.

Grant بیش‌ازحد حافظه را بی‌دلیل رزرو می‌کند و Grant کم Spill به tempdb می‌سازد. Feedback در Batch Mode برای Queryهای تکرارشونده تلاش می‌کند اندازه Grant را متعادل کند.

اصل عملی: تنظیم Performance فقط وقتی ارزش دارد که مسئله، معیار موفقیت و راه برگشت آن از قبل روشن باشد.

Syntax اصلی

ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = ON;

مقادیر و رفتار

  • مقدار یا فرمان: ON یا OFF.
  • سناریوی مناسب: گزارش ستاره‌ای بزرگ با Columnstore و Hash Join یا Sort سنگین
  • ریسک اصلی: در Workload بسیار متغیر اندازه مناسب Grant ثابت نیست و باید Spill، Granted Memory و Concurrency کنار هم دیده شوند.
  • نکته نسخه: Batch Mode Memory Grant Feedback بخشی از Intelligent Query Processing است؛ کنترل Database-scoped آن در نسخه‌های جدید SQL Server وجود دارد.
BATCH_MODE_MEMORY_GRANT_FEEDBACK - نمودار فنی 1نقشه معماری BATCH_MODE_MEMORY_GRANT_FEEDBACK و اجزای مرتبط در SQL ServerBATCH_MODE_MEMORY_GRANT_FEEDBACKBatch ModeMemory GrantFeedbackSpillColumnstoretempdbBatch ModeMemory GrantFeedbackSpill

این نقشه رابطه BATCH_MODE_MEMORY_GRANT_FEEDBACK را با Memory Grant، Feedback و شاخص‌های Runtime نشان می‌دهد. تصویر برای فهم دامنه اثر است و جای Execution Plan واقعی را نمی‌گیرد.

چطور قبل از تغییر تصمیم بگیریم

قبل از اجرای تغییر، Queryهای نماینده را بر اساس اهمیت تجاری و مصرف منابع جدا کنید. Plan آنها را در Query Store نگه دارید و فقط یک متغیر را تغییر دهید. اگر هم‌زمان Index، Compatibility Level و BATCH_MODE_MEMORY_GRANT_FEEDBACK را عوض کنید، Attribution نتیجه از بین می‌رود.

معیار تک Query و معیار کل Workload را جدا ببینید. ممکن است یک Query سریع‌تر شود اما Throughput کل افت کند. در Workload بسیار متغیر اندازه مناسب Grant ثابت نیست و باید Spill، Granted Memory و Concurrency کنار هم دیده شوند. به همین دلیل Concurrency و مصرف منابع باید کنار زمان پاسخ سنجیده شود.

اشتباه رایج: قضاوت درباره Feature فقط با زمان یک اجرای سرد و بدون نگاه به Spill، Concurrency و چند اجرای متوالی. راه حرفه‌ای این است که فرضیه، Baseline، Change و Rollback در یک سند کوتاه و قابل بازبینی ثبت شوند.

BATCH_MODE_MEMORY_GRANT_FEEDBACK - نمودار فنی 2جریان اجرای BATCH_MODE_MEMORY_GRANT_FEEDBACK از پیکربندی تا RuntimeBATCH_MODE_MEMORY_GRANT_FEEDBACKALTERBatch ModeOptimizerFeedbackRuntimeColumnstoretempdbBatch ModeMemory GrantFeedbackSpill

جریان BATCH_MODE_MEMORY_GRANT_FEEDBACK از مشاهده وضعیت، اعمال Change، Compile یا Runtime Behavior و سپس Measure عبور می‌کند. نقاط اندازه‌گیری قبل و بعد باید یکسان باشند.

۱۰ مثال عملی و قابل اجرا

مثال 1: مشاهده وضعیت واقعی قبل از تغییر

برای کنترل Batch Mode Memory Grant Feedback اولین قدم تغییر نیست؛ ثبت وضعیت فعلی است. خروجی را همراه زمان، نسخه و نام Database نگه دارید تا Baseline قابل استناد باشد.

SELECT name, value, value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = N'BATCH_MODE_MEMORY_GRANT_FEEDBACK';
namevalueبرداشت
BATCH_MODE_MEMORY_GRANT_FEEDBACKمقدار فعلیاز همان سرور خوانده شود

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 2: فعال‌سازی کنترل‌شده در محیط آزمایشی

در این سناریو BATCH_MODE_MEMORY_GRANT_FEEDBACK را فقط جایی تغییر می‌دهیم که Baseline داریم. یک اجرای سریع برای تصمیم نهایی کافی نیست و باید چند چرخه کاری قابل مقایسه سنجیده شود.

ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = ON;
عملیاتخروجی نمونهکنترل
BATCH_MODE_MEMORY_GRANT_FEEDBACKCommand completed successfullyمقدار دوباره خوانده شود

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 3: بازگشت مستند به رفتار قبلی

Performance Change بدون Rollback کامل نیست. چون در Workload بسیار متغیر اندازه مناسب Grant ثابت نیست و باید Spill، Granted Memory و Concurrency کنار هم دیده شوند.، فرمان بازگشت باید پیش از Deployment آماده باشد و تیم در زمان Incident بداهه‌کاری نکند.

ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = OFF;
Rollbackخروجی نمونهمعیار
BATCH_MODE_MEMORY_GRANT_FEEDBACKCommand completed successfullyرفتار قبلی تأیید شود

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 4: بررسی Compatibility Level

بسیاری از قابلیت‌ها به Compatibility Level وابسته‌اند. پیش از نتیجه‌گیری درباره BATCH_MODE_MEMORY_GRANT_FEEDBACK، نسخه Engine و سطح سازگاری Database را کنار هم ثبت کنید.

SELECT DB_NAME() AS DatabaseName, compatibility_level
FROM sys.databases
WHERE database_id = DB_ID();
Databasecompatibility_levelنکته
CurrentDatabase150/160/170وابسته به نسخه و محیط

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 5: مقایسه قبل و بعد با Query Store

Query Store امکان دیدن Plan و Runtime را در دو بازه زمانی می‌دهد. برای کنترل Batch Mode Memory Grant Feedback این داده تاریخی بسیار قابل اعتمادتر از یک Screenshot یا حس کلی کاربر است.

SELECT TOP (20) qsq.query_id, qsp.plan_id, rs.avg_duration, rs.avg_cpu_time
FROM sys.query_store_query AS qsq
JOIN sys.query_store_plan AS qsp ON qsp.query_id = qsq.query_id
JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = qsp.plan_id
ORDER BY rs.avg_duration DESC;
منبعخروجیتفسیر
Query StorePlan/Runtime rowsبازه قبل و بعد هم‌سطح باشد

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 6: ساخت Workload کوچک و قابل تکرار

Workload آزمایشی باید همان رفتاری را تحریک کند که Feature برای آن ساخته شده است: اصلاح تدریجی Memory Grant Queryهای Batch Mode با استفاده از تجربه اجراهای قبلی. Query خیلی کوچک ممکن است هیچ تفاوتی نشان ندهد.

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT TOP (1000) object_id, name, type_desc
FROM sys.objects
ORDER BY object_id DESC;
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
Metricنمونهنکته
Elapsed/CPU/Readsوابسته به دادهچند اجرا مقایسه شود

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 7: خواندن شاخص Runtime مرتبط

یک DMV به‌تنهایی حقیقت کامل Performance نیست. برای BATCH_MODE_MEMORY_GRANT_FEEDBACK داده Runtime را کنار Execution Plan، Query Store و وضعیت منابع قرار دهید.

SELECT TOP (20) session_id, requested_memory_kb, granted_memory_kb, required_memory_kb, used_memory_kb
FROM sys.dm_exec_query_memory_grants
ORDER BY requested_memory_kb DESC;
Runtime signalنمونهبرداشت
Feedbackقابل اندازه‌گیریروند مهم‌تر از Snapshot است

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 8: پیداکردن Queryهای پرریسک

به‌جای جست‌وجوی تصادفی، Queryهای پرتکرار یا پرمصرف را جدا کنید و ببینید آیا مشکل واقعاً با اصلاح تدریجی Memory Grant Queryهای Batch Mode با استفاده از تجربه اجراهای قبلی ارتباط دارد یا علت اصلی Statistics، Index، Blocking یا طراحی Query است.

SELECT TOP (20) qs.execution_count, qs.total_worker_time, qs.total_elapsed_time,
       SUBSTRING(st.text,1,300) AS sample_sql
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY qs.total_worker_time DESC;
Queryنشانهاقدام
Top workloadCPU/Duration/SpillPlan واقعی بررسی شود

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 9: قرار دادن Guard در Deployment

Deployment حرفه‌ای باید Fail Fast باشد. Guard نسخه‌ای کمک می‌کند تغییر BATCH_MODE_MEMORY_GRANT_FEEDBACK روی محیطی که ارزیابی نشده اجرا نشود و رفتار غیرمنتظره نسازد.

IF CAST(SERVERPROPERTY('ProductMajorVersion') AS int) >= 13
BEGIN
    ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = ON;
END
ELSE
    THROW 50010, N'نسخه موتور برای این Deployment بررسی شود.', 1;
DeploymentResultSafety
Version guardPass/Throwاجرای کنترل‌شده

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

مثال 10: Rollback و تأیید مقدار نهایی

Rollback فقط اجرای Command معکوس نیست. مقدار نهایی، Planهای مهم و Metricهای Baseline باید دوباره کنترل شوند تا بازگشت واقعاً تأیید شود.

-- Rollback کنترل‌شده
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = OFF;
SELECT name, value, value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = N'BATCH_MODE_MEMORY_GRANT_FEEDBACK';
مرحلهخروجیمعیار پایان
Rollbackتنظیم قبلیBaseline دوباره کنترل شود

خروجی جدول فقط شکل نمونه نتیجه را نشان می‌دهد. مقدار واقعی BATCH_MODE_MEMORY_GRANT_FEEDBACK به نسخه، داده و بار سیستم شما وابسته است؛ خروجی واقعی را با Timestamp ذخیره کنید.

خطاهای رایج

  • قضاوت درباره Feature فقط با زمان یک اجرای سرد و بدون نگاه به Spill، Concurrency و چند اجرای متوالی.
  • اعمال چند تغییر Performance در یک Release و از دست دادن امکان تشخیص علت.
  • مقایسه Warm Cache با Cold Cache و نتیجه‌گیری قطعی.
  • نادیده گرفتن تفاوت نسخه، CU و Compatibility Level بین Test و Production.
  • تمرکز فقط روی Duration و ندیدن CPU، Reads، Memory، Spill، Blocking یا Throughput.

Performance Considerations

اثر BATCH_MODE_MEMORY_GRANT_FEEDBACK را با Metric همان Feature بسنجید. مفاهیم کلیدی این مقاله: Batch Mode, Memory Grant, Feedback, Spill, Columnstore. اگر معیار انتخابی با این زنجیره ارتباطی ندارد، آزمایش ممکن است نتیجه گمراه‌کننده بدهد.

در Workload بسیار متغیر اندازه مناسب Grant ثابت نیست و باید Spill، Granted Memory و Concurrency کنار هم دیده شوند. این ریسک دلیل طراحی آزمایش بهتر است، نه دلیل تصمیم عجولانه. Query Store، Actual Plan و DMVهای Runtime را کنار هم ببینید.

بهترین روش‌ها

  1. مقدار فعلی، نسخه Engine و Compatibility Level را ثبت کنید.
  2. Baseline Queryهای حیاتی را بگیرید.
  3. تغییر را ابتدا در محیط مشابه Production یا بازه کم‌ریسک اجرا کنید.
  4. فقط یک متغیر Performance را عوض کنید.
  5. Rollback را پیش از Deployment بنویسید.
  6. Plan و Runtime را در چند بازه بررسی کنید.
  7. اگر نتیجه مبهم است تغییر را دائمی نکنید.
BATCH_MODE_MEMORY_GRANT_FEEDBACK - نمودار فنی 3سناریوی Baseline و Best Practice برای BATCH_MODE_MEMORY_GRANT_FEEDBACKBATCH_MODE_MEMORY_GRANT_FEEDBACKBaselineBatch ModeAfter ChangeSpillMeasureColumnstoreBest Practice: tempdbBatch ModeMemory GrantFeedbackSpill

سناریوی عملی BATCH_MODE_MEMORY_GRANT_FEEDBACK سه بخش دارد: Baseline، تغییر کنترل‌شده و تصمیم بر اساس Measure. حذف هر کدام کیفیت تصمیم را پایین می‌آورد.

سؤالات متداول

BATCH_MODE_MEMORY_GRANT_FEEDBACK دقیقاً چه مشکلی را هدف می‌گیرد؟

برای اصلاح تدریجی Memory Grant Queryهای Batch Mode با استفاده از تجربه اجراهای قبلی طراحی شده است. ارزش آن زمانی روشن می‌شود که قبل از تغییر Baseline داشته باشید و اثر را روی Workload واقعی بسنجید.

مقدار فعلی BATCH_MODE_MEMORY_GRANT_FEEDBACK را چگونه ببینیم؟

از sys.database_scoped_configurations شروع کنید و خروجی را کنار نسخه Engine، Compatibility Level و وضعیت Query Store ثبت کنید.

آیا BATCH_MODE_MEMORY_GRANT_FEEDBACK همیشه SQL Server را سریع‌تر می‌کند؟

خیر. در Workload بسیار متغیر اندازه مناسب Grant ثابت نیست و باید Spill، Granted Memory و Concurrency کنار هم دیده شوند. بنابراین CPU، Duration، Reads و Metric مرتبط با Feature باید قبل و بعد مقایسه شوند.

چه سناریوی تجاری برای BATCH_MODE_MEMORY_GRANT_FEEDBACK مناسب است؟

نمونه روشن: گزارش ستاره‌ای بزرگ با Columnstore و Hash Join یا Sort سنگین. در پروژه واقعی Change Window، Rollback و معیار موفقیت را قبل از تغییر تعریف کنید.

BATCH_MODE_MEMORY_GRANT_FEEDBACK چه تفاوتی با تنظیم سراسری دارد؟

Database Scoped Configuration دامنه اثر را محدودتر می‌کند و برای Instanceهای چند Workload کنترل دقیق‌تری می‌دهد؛ با این حال Hintهای Query و تنظیمات دیگر ممکن است رفتار نهایی را تغییر دهند.

برای پیاده‌سازی حرفه‌ای BATCH_MODE_MEMORY_GRANT_FEEDBACK چه کاری لازم است؟

بررسی Query Store، Execution Plan، Baseline، تست بار و Rollback. آموزش و مشاوره زمانی مفید است که تصمیم بر اساس داده همان سامانه گرفته شود.

رایج‌ترین خطا درباره BATCH_MODE_MEMORY_GRANT_FEEDBACK چیست؟

قضاوت درباره Feature فقط با زمان یک اجرای سرد و بدون نگاه به Spill، Concurrency و چند اجرای متوالی. این کار اغلب یک درمان موقت را به سیاست دائمی تبدیل می‌کند.

اثر Performance BATCH_MODE_MEMORY_GRANT_FEEDBACK را چگونه بسنجیم؟

بازه‌های هم‌سطح را مقایسه کنید و CPU، Duration، Reads و Metric تخصصی Feature را بسنجید. Query Store برای Plan Regression بسیار مفید است.

Best Practice تغییر BATCH_MODE_MEMORY_GRANT_FEEDBACK چیست؟

تغییر را کوچک، مستند و قابل برگشت نگه دارید؛ فقط یک متغیر Performance را در هر آزمایش عوض کنید و نتیجه را چند بار بسنجید.

BATCH_MODE_MEMORY_GRANT_FEEDBACK با چه نسخه‌هایی سازگار است؟

Batch Mode Memory Grant Feedback بخشی از Intelligent Query Processing است؛ کنترل Database-scoped آن در نسخه‌های جدید SQL Server وجود دارد. مستندات همان نسخه و Compatibility Level محیط خود را ملاک نهایی قرار دهید.

سؤالات مصاحبه

  1. چرا برای BATCH_MODE_MEMORY_GRANT_FEEDBACK Baseline لازم است؟
  2. اگر بعد از تغییر BATCH_MODE_MEMORY_GRANT_FEEDBACK یک Query بهتر و چند Query بدتر شوند چه می‌کنید؟
  3. Query Store در ارزیابی کنترل Batch Mode Memory Grant Feedback چه نقشی دارد؟
  4. چطور مشکل Statistics را از اثر BATCH_MODE_MEMORY_GRANT_FEEDBACK جدا می‌کنید؟
  5. Rollback شما برای BATCH_MODE_MEMORY_GRANT_FEEDBACK در Production چیست؟

چک‌لیست نهایی

  • مقدار فعلی BATCH_MODE_MEMORY_GRANT_FEEDBACK ثبت شده است.
  • Baseline مشخص است.
  • نسخه و Compatibility Level کنترل شده‌اند.
  • معیار موفقیت و شکست نوشته شده‌اند.
  • Rollback آماده است.
  • Query Store و Planهای مهم بعد از تغییر بررسی می‌شوند.

جمع‌بندی

کنترل Batch Mode Memory Grant Feedback زمانی مفید است که با مسئله واقعی و قابل اندازه‌گیری استفاده شود. اصلاح تدریجی Memory Grant Queryهای Batch Mode با استفاده از تجربه اجراهای قبلی. به‌جای تغییر بر اساس توصیه عمومی، Workload خودتان را بسنجید و تغییر را قابل برگشت نگه دارید.

برای مقایسه این گزینه با سایر اعضای همین خانواده به مقاله مادر تنظیمات Performance در سطح Database برگردید.

خدمات برنامه‌نویسی و پایگاه داده

برنامه‌نویسی در اصفهان؛ قبول سفارش‌های برنامه‌نویسی و پایگاه داده: 09131253620. انجام پروژه، آموزش برنامه‌نویسی و آموزش پایگاه داده SQL Server برای پروژه‌های آموزشی، سازمانی و تجاری.

مجموعه‌ای معتبر با سابقه فعالیت حرفه‌ای از سال ۱۳۷۵ شمسی

از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژه‌های برنامه‌نویسی، پایگاه داده، سیستم‌های تحت وب، وب‌سایت و راهکارهای نرم‌افزاری فعالیت می‌کنیم.

برای سفارش پروژه‌های برنامه‌نویسی و پایگاه داده، سیستم‌های تحت وب، وب‌سایت و راهکارهای نرم‌افزاری جدید با شماره 09131253620 تماس حاصل فرمایید.

ایتا، واتساپ و تماس مستقیم: +989131253620

تماس با ما

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر