در 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)
- آیا همه کوئریها از Statistics استفاده میکنند؟
تقریباً بله. Query Optimizer برای تخمین تعداد ردیفها در اکثر کوئریها به Statistics وابسته است. - Statistics جای ایندکس را میگیرد؟
خیر، Statistics فقط به تصمیمگیری کمک میکند، اما بدون ایندکس مناسب، حتی بهترین آمار هم نمیتواند جلوی Scanهای سنگین را بگیرد. - هر چند وقت یکبار باید Statistics را آپدیت کنیم؟
بستگی به حجم تغییر داده دارد. در سیستمهای پرتراکنش، روزانه یا حتی چندبار در روز برای جداول بزرگ توصیه میشود. - از کجا بفهمم Statistics قدیمی شده؟
میتوان از DMV ها مثلsys.dm_db_stats_propertiesبرای دیدن آخرین زمان بهروزرسانی و تعداد تغییرات استفاده کرد. - آیا آپدیت Statistics باعث قفل شدن دول میشود؟
در حالت عادی نه، اما ممکن است باعث افزایش I/O و CPU شود. به همین دلیل زمانبندی خارج از ساعات اوج مصرف مهم است.
تحلیل تخصصی Performance SQL Server را به لاندا بسپارید.
اگر Execution Plan های غیرقابل پیشبینی، کندی ناگهانی کوئریها یا مصرف بالای منابع در SQL Server شما دیده میشود، احتمال زیادی وجود دارد که مشکل از مدیریت نادرست Statistics باشد، نه کمبود سختافزار یا ضعف ایندکسها.
تیم تخصصی لاندا با تحلیل عمیق Execution Plan، بررسی الگوی تغییر داده و طراحی استراتژی هوشمند Statistics، میتواند بدون تغییر در کد نرمافزار، جهش جدی در Performance دیتابیس شما ایجاد کند.
برای مشاوره تخصصی، عیبیابی Performance و پیادهسازی استراتژی حرفهای Statistics همین حالا با لاندا تماس ✆ بگیرید.
بهینهسازی واقعی از جایی شروع میشود که دیگران فقط ایندکس اضافه میکنند.

و سپس «افزودن به صفحه اصلی» ضربه بزنید
و سپس «افزودن به صفحه اصلی» ضربه بزنید

No comment