TempDB Design, TempDB Contention, PAGELATCH, SQL Server Always On, Failover Cluster, TempDB Best Practices, Version Store, RCSI, Snapshot Isolation, TempDB Performance, DBA حرفه‌ای, مانیتورینگ SQL, خدمات لاندا

در معماری پایگاه داده‌های سازمانی که حجم تراکنش‌ها بالا، تعداد Sessionها زیاد و گزارش‌گیری هم‌زمان فعال است، TempDB یکی از پر ترافیک‌ترین و حساس‌ترین اجزای SQL Server محسوب می‌شود. این Database موقتی، نقش انبار عملیاتی SQL Engine را ایفا می‌کند و تقریباً تمام Queryها حتی اگر مستقیماً از آن استفاده نکنند، به‌نوعی به منابع آن متکی هستند.

اگر TempDB به‌ درستی طراحی نشده باشد، نتیجه چیست؟

  • کندی ناگهانی یا دوره‌ای (Intermittent Slowness)
  • صف شدن Queryها و Waitهای طولانی
  • Latch Contention روی صفحات PFS / GAM / SGAM
  • فشار روی CPU و IO بدون رشد محسوس حجم داده‌ها
  • افزایش زمان Failover در Always On

به همین دلیل، طراحی و پیکربندی TempDB برای DBAهای حرفه‌ای، به‌ویژه در محیط‌های Failover Cluster / Always On Availability Groups یک مهارت حیاتی است.

در این مقاله، مرحله‌به‌مرحله:

  • ساختار داخلی
  • علت‌های Contention
  • نشانه‌ها و روش‌های تشخیص
  • اصول طراحی استاندارد در محیط‌های Cluster
  • بهینه‌سازی و Script عملی پیاده‌سازی

را شرح می‌دهیم.

TempDB چیست و چرا این‌قدر مهم است؟

یک Shared Workspace است که برای عملیات‌های موقت و میانی استفاده می‌شود:

کاربردتوضیح
Sort و AggregationORDER BY، GROUP BY، DISTINCT
Hash Join و Query Memory Spillهنگام کمبود Memory Grant
Version Storeهنگام استفاده از RCSI و Snapshot Isolation
Temporary Tables و Table Variablesدر Stored Procedureها و Queryها
Row Versioning در Always Onبرای خواندن سازگار و هماهنگ

اگر حجم Queryها بالا باشد یا Memory کافی تخصیص نیابد، حجم زیادی از عملیات‌ها به TempDB منتقل می‌شود و فشار هم‌زمان روی فایل‌های TempDB احتمال Contention را افزایش می‌دهد.

ساختار داخلی TempDB و ریشه Contention

دیتابیس موقت از Allocation Bitmap‌هایی استفاده می‌کند که تصمیم می‌گیرند هر Object در کدام Page قرار گیرد:

  • PFS (Page Free Space) → وضعیت فضای آزاد صفحات
  • GAM (Global Allocation Map) → صفحات تخصیص‌یافته
  • SGAM (Shared Global Allocation Map) → صفحات تقسیم‌شده مشترک

وقتی تعداد Sessionها زیاد باشد، همه آن‌ها برای دسترسی به این صفحات در صف می‌مانند → Latch Contention.

نشانه واضح:

Wait Type = PAGELATCH_UP / PAGELATCH_EX

نشانه‌های Contention

SELECT 
    wait_type, 
    waiting_tasks_count, 
    wait_time_ms 
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE 'PAGELATCH%';

اگر waitهای زیر زیاد بود → مشکل قطعی TempDB:

  • PAGELATCH_EX
  • PAGELATCH_SH
  • PAGEIOLATCH_UP/EX (در صورت IO Bottleneck)

طراحی اصولی TempDB در محیط Always On Cluster

۱) محل ذخیره‌سازی

در هر نود از کلاستر، TempDB Local است (تحت Failover منتقل نمی‌شود).
پس:

گزینهتوصیه
HDD / SATAممنوع
SSDقابل
NVMe / PCIeتوصیه‌شده
Storage Sharedهرگز
Local Dedicated SSDاستاندارد Enterprise

دلیل: TempDB I/O Local باعث کاهش تأخیر Failover و جلوگیری از Stale Locks می‌شود.

۲) تعداد فایل‌ها

فرمول استاندارد:

تعداد فایل‌ها = تعداد هسته‌های CPU / 4  (حداکثر ۸ فایل برای شروع)

مثال:
سروری با ۳۲ Core:

۳۲ / ۴ = 8 فایل TempDB

اگر باز هم Contention ادامه داشت → افزایش تدریجی تا سقف ۱ فایل به ازای هر Core
(اما فقط با مشاهده مانیتورینگ)

۳) اندازه اولیه (Initial Size) و Growth ثابت

اشتباه رایج:
ایجاد با Size بسیار کوچک و Auto-Growth کوچک یا درصدی.

راهکار:

ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 4GB, FILEGROWTH = 256MB);
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, SIZE = 2GB, FILEGROWTH = 256MB);
  • Size اولیه بزرگ تنظیم شود.
  • Growth درصدی ممنوع → فقط رشد ثابت (MB)

۴) فعال‌سازی Trace Flagهای مدرن

در نسخه‌های جدید، رفتار Allocation بهینه شده است، اما در SQL Server قدیمی‌تر:

TF 1117 → رشد هم‌زمان فایل‌ها
TF 1118 → جلوگیری از SGAM Contention

برای SQL Server 2016 به بالا  به‌صورت پیش‌فرض فعال است و اگر نسخه شما پایین تر از ۲۰۱۶ است دستورات زیر را اجرا کنید:

DBCC TRACEON(1117, -1);
DBCC TRACEON(1118, -1);

تأثیر RCSI و Snapshot Isolation بر TempDB

اگر داده‌ها با RCSI خوانده شوند، نسخه‌برداری ردیف‌ها در TempDB ذخیره می‌شود.

فعال‌سازی اشتباه RCSI = انفجار TempDB.

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON;

توصیه: فقط در دیتابیس‌هایی که IO و TempDB طراحی استاندارد دارند.

اسکریپت پیاده‌سازی استاندارد TempDB (مناسب Always On Cluster)

USE master;
GO

ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 4096MB, FILEGROWTH = 256MB);
GO

DECLARE @i INT = 2;
WHILE @i <= 8
BEGIN
   EXEC ('ALTER DATABASE tempdb ADD FILE (NAME = tempdb' + CAST(@i AS VARCHAR(3)) 
   + ', FILENAME = ''D:\SQLData\tempdb' + CAST(@i AS VARCHAR(3)) + '.ndf'', SIZE = 4096MB, FILEGROWTH = 256MB)');
   SET @i += 1;
END
GO

چک‌لیست نهایی طراحی TempDB (نسخه اجرایی)

آیتموضعیت
ایجاد دیتابیس موقت روی Local NVMe SSD
تعداد فایل‌ها = CPU / 4 (حداقل ۴، حداکثر برابر هسته‌ها)
Initial Size >= 4GB هر فایل
Filegrowth ثابت (مثلاً 256MB)
بررسی PAGELATCH Waitها هر ۲۴ ساعت
فعال‌سازی یا تأیید TF 1117 / 1118 یا معادل مدرن
سوالات متداول FAQ
سؤالپاسخ
آیا افزایش تعداد فایل‌ها همیشه مفید است؟خیر، افزایش زیاد باعث Fragmentation و مدیریت پیچیده می‌شود.
چرا TempDB بین نودهای Always On مشترک نیست؟زیرا موقت است و وابسته به Instance نه Database.
بهترین دیسک برای TempDB چیست؟NVMe محلی با Latency < 1ms
آیا TempDB به Backup نیاز دارد؟خیر. خودکار با هر ریستارت ایجاد می‌شود.
تماس و مشاوره با لاندا 

اگر سرور SQL شما با کندی، صف شدن Queryها یا Waitهای PAGELATCH مواجه است، تیم مانیتورینگ و DBA لاندا می‌تواند در کمتر از ۴۸ ساعت تحلیل Contention و بهینه‌سازی طراحی را انجام دهد.

برای درخواست مشاوره تخصصی قابل ارائه در شرکتها و سازمان‌ها با لاندا تماس بگیرید.

نظری داده نشده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *