SQL Server Statistics-بهینه‌سازی کوئری‌ها-هیستوگرام-Density Vector-Index Seek-Index Scan

در SQL Server، ‏Statistics مجموعه‌ای از اطلاعات آماری درباره نحوه توزیع داده‌ها در یک ستون یا ترکیبی از ستون‌هاست. درک اهمیت SQL Server در Statistics از این جهت حیاتی است که این اطلاعات به Query Optimizer کمک می‌کنند تا پیش از اجرای کوئری، تخمین بزند چه تعداد ردیف بازگردانده می‌شود و بر اساس همین تخمین، بهترین مسیر اجرا یا همان Execution Plan را انتخاب کند.

به زبان ساده، اگر Statistics دقیق نباشد، SQL Server در حال تصمیم‌گیری با اطلاعات اشتباه است؛ درست مثل مدیری که گزارش فروش اشتباه دارد و بر اساس آن برنامه‌ریزی می‌کند. نتیجه این وضعیت، Execution Plan اشتباه، مصرف بالای CPU، I/O زیاد و در نهایت کندی سیستم خواهد بود.

Statistics چه زمانی ساخته می‌شود؟

Statistics در SQL Server به سه شکل اصلی ایجاد یا به‌روزرسانی می‌شود:

ایجاد خودکار (Auto Create Statistics)

وقتی گزینه AUTO_CREATE_STATISTICS فعال باشد، SQL Server هنگام اجرای یک کوئری که روی ستونی بدون آمار مناسب فیلتر یا Join انجام می‌دهد، به‌صورت خودکار Statistics ایجاد می‌کند.

این اتفاق معمولاً زمانی رخ می‌دهد که:

  • روی ستونی در شرط WHERE فیلتر می‌زنید.
  • از ستونی در JOIN استفاده می‌کنید.
  • ستون در GROUP BY یا ORDER BY حضور دارد.

به‌روزرسانی خودکار (Auto Update Statistics)

اگر حجم قابل توجهی از داده‌های جدول تغییر کند (INSERT, UPDATE, DELETE)، SQL Server تشخیص می‌دهد که آمار قدیمی شده و آن را به‌صورت خودکار به‌روزرسانی می‌کند.

ایجاد یا به‌روزرسانی دستی توسط DBA

در محیط‌های سازمانی حرفه‌ای، معمولاً DBA ها کنترل Statistics را به‌صورت دستی یا زمان‌بندی‌شده در دست می‌گیرند، چون Auto Update همیشه در بهترین زمان ممکن اجرا نمی‌شود.

اجزای اصلی Statistics در SQL Server

Histogram (هیستوگرام)

مهم‌ترین بخش Statistics است. هیستوگرام توزیع داده‌ها را برای یک ستون نشان می‌دهد و SQL Server از آن برای تخمین تعداد ردیف‌های خروجی استفاده می‌کند.

مثلاً وقتی می‌نویسید:

WHERE OrderDate = '2025-01-01'

Optimizer از Histogram استفاده می‌کند تا حدس بزند چند رکورد مربوط به آن تاریخ است.

هیستوگرام فقط برای اولین ستون در Statistics چندستونه ساخته می‌شود، که همین موضوع اهمیت ترتیب ستون‌ها را بالا می‌برد.

Density Vector (بردار تراکم)

Density نشان می‌دهد که مقادیر یک ستون یا ترکیب ستون‌ها چقدر تکرارپذیر هستند. هرچه Density کمتر باشد، ستون Selective تر است و احتمال استفاده از Index Seek بیشتر می‌شود.

این بخش برای تخمین در شرایطی مثل JOIN بین چند ستون بسیار حیاتی است.

Row Count و Distinct Values

Statistics شامل اطلاعاتی درباره:

  • تعداد کل ردیف‌ها
  • تعداد مقادیر یکتا

است که در تصمیم‌گیری بین عملیات‌هایی مثل Hash Join، Nested Loop یا Merge Join نقش مستقیم دارد.

چرا Statistics برای Performance حیاتی است؟

بدون Statistics دقیق، Query Optimizer عملاً کور است.

مهم‌ترین تاثیرات Statistics دقیق:

✔ انتخاب بین Index Seek و Index Scan
✔ تصمیم درست برای نوع Join
✔ تخمین صحیح حافظه موردنیاز برای Sort و Hash
✔ جلوگیری از Spill شدن به TempDB
✔ کاهش CPU و I/O

در بسیاری از پروژه‌های سازمانی، فقط با به‌روزرسانی صحیح Statistics، بدون هیچ تغییر در کد یا ایندکس، تا چندین برابر بهبود Performance دیده شده است.

ایجاد و به‌روزرسانی Statistics

ایجاد دستی Statistics

CREATE STATISTICS stats_ColumnName
ON TableName (ColumnName);

برای ستون‌هایی که زیاد در فیلتر و Join استفاده می‌شوند ولی ایندکس ندارند، این کار می‌تواند معجزه کند.

به‌روزرسانی دستی Statistics

UPDATE STATISTICS YourTableName;

یا با نمونه‌برداری کامل:

UPDATE STATISTICS YourTableName WITH FULLSCAN;

FULLSCAN دقت بالاتری دارد ولی زمان و I/O بیشتری مصرف می‌کند.

فعال بودن تنظیمات خودکار

ALTER DATABASE YourDatabaseName SET AUTO_CREATE_STATISTICS ON;
ALTER DATABASE YourDatabaseName SET AUTO_UPDATE_STATISTICS ON;

در اغلب سیستم‌ها این گزینه‌ها باید روشن باشند، اما در دیتابیس‌های بسیار بزرگ، نیاز به استراتژی مکمل دارند.

وقتی Statistics قدیمی می‌شود چه فاجعه‌ای رخ می‌دهد؟

  • کوئری که قبلاً سریع بود ناگهان کند می‌شود.
  • Execution Plan به‌شدت تغییر می‌کند.
  • به‌جای Seek، Scan اتفاق می‌افتد.
  • Join اشتباه انتخاب می‌شود.
  • مصرف TempDB بالا می‌رود.
  • Blocking و Deadlock بیشتر می‌شود.

خیلی وقت‌ها تیم‌ها سراغ ایندکس جدید یا تغییر کد می‌روند، در حالی که ریشه مشکل فقط Statistics قدیمی است.

استراتژی‌های حرفه‌ای برای مدیریت Statistics

روشتوضیحمناسب برای
Auto Updateبروزرسانی خودکار توسط SQL Serverسیستم‌های کوچک تا متوسط
Job زمان‌بندی‌شدهاجرای منظم UPDATE STATISTICSمحیط‌های سازمانی
FULLSCAN دوره‌ایدقت بالا برای جداول حساسجداول تحلیلی یا بحرانی
Trace Flag 2371آستانه هوشمند برای آپدیت در DB بزرگدیتابیس‌های حجیم

در سازمان‌های حرفه‌ای، معمولاً ترکیبی از Auto Update و Jobهای زمان‌بندی‌شده استفاده می‌شود.

Best Practice های طلایی در مدیریت Statistics

  • برای جداول بزرگ، فقط به Auto Update اکتفا نکنید.
  • بعد از Bulk Insert یا تغییرات حجیم، Statistics را دستی آپدیت کنید.
  • روی ستون‌های پرکاربرد بدون ایندکس، Statistics جداگانه بسازید.
  • برای کوئری‌های حساس، تست با FULLSCAN انجام دهید.
  • Execution Plan های ناپایدار را از نظر Statistics بررسی کنید.

سوالات متداول (FAQ)

  1. آیا همه کوئری‌ها از Statistics استفاده می‌کنند؟
    تقریباً بله. Query Optimizer برای تخمین تعداد ردیف‌ها در اکثر کوئری‌ها به Statistics وابسته است.
  2. Statistics جای ایندکس را می‌گیرد؟
    خیر، Statistics فقط به تصمیم‌گیری کمک می‌کند، اما بدون ایندکس مناسب، حتی بهترین آمار هم نمی‌تواند جلوی Scanهای سنگین را بگیرد.
  3. هر چند وقت یک‌بار باید Statistics را آپدیت کنیم؟
    بستگی به حجم تغییر داده دارد. در سیستم‌های پرتراکنش، روزانه یا حتی چندبار در روز برای جداول بزرگ توصیه می‌شود.
  4. از کجا بفهمم Statistics قدیمی شده؟
    می‌توان از DMV ها مثل sys.dm_db_stats_properties برای دیدن آخرین زمان به‌روزرسانی و تعداد تغییرات استفاده کرد.
  5. آیا آپدیت Statistics باعث قفل شدن دول می‌شود؟
    در حالت عادی نه، اما ممکن است باعث افزایش I/O و CPU شود. به همین دلیل زمان‌بندی خارج از ساعات اوج مصرف مهم است.
تحلیل تخصصی Performance SQL Server را به لاندا بسپارید.

اگر Execution Plan های غیرقابل پیش‌بینی، کندی ناگهانی کوئری‌ها یا مصرف بالای منابع در SQL Server شما دیده می‌شود، احتمال زیادی وجود دارد که مشکل از مدیریت نادرست Statistics باشد، نه کمبود سخت‌افزار یا ضعف ایندکس‌ها.

تیم تخصصی لاندا با تحلیل عمیق Execution Plan، بررسی الگوی تغییر داده و طراحی استراتژی هوشمند Statistics، می‌تواند بدون تغییر در کد نرم‌افزار، جهش جدی در Performance دیتابیس شما ایجاد کند.

برای مشاوره تخصصی، عیب‌یابی Performance و پیاده‌سازی استراتژی حرفه‌ای Statistics همین حالا با لاندا تماس  بگیرید.
بهینه‌سازی واقعی از جایی شروع می‌شود که دیگران فقط ایندکس اضافه می‌کنند.

No comment

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

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