راهنمای جامع توابع کمکی کارایی و Metadata در SQL Server
توابع کمکی SQL Server میان داده خام موتور و گزارش قابل فهم قرار میگیرند. برخی نام و شناسه اشیا را به یکدیگر تبدیل میکنند، برخی ویژگی فایل، ایندکس، Database یا Session را میخوانند و گروهی دیگر شمارندههای تجمعی Instance را برای ساخت Baseline در اختیار میگذارند.
این راهنما ۲۶ تابع و متغیر سیستمی را در پنج گروه عملی بررسی میکند. برای هر مورد توضیح مستقل، کاربرد واقعی و لینک مستقیم به مقاله تخصصی قرار گرفته است تا خواننده بتواند از نمای کلی به آموزش عمیق همان ابزار برسد.
اصل مهم این مجموعه آن است که هیچ مقدار سیستمی بدون Context تفسیر نشود. شناسه بدون نام، شمارنده تجمعی بدون Uptime، Property بدون نوع داده و فایل بدون Database جاری میتواند گزارشی بسازد که ظاهراً دقیق اما در عمل گمراهکننده است.
دسترسی سریع به آموزشهای مستقل
نقشه مفهومی بالا، پنج لایه اصلی این مجموعه را نشان میدهد: Metadata اشیا، Context پایگاه داده، ظرفیت فایل، ساختار ایندکس و Statistics، تنظیمات Session و شمارندههای Performance.
گروه 1: تبدیل نام و شناسه اشیا و پایگاه داده
OBJECT_NAME در SQL Server
تابع OBJECT_NAME شناسه عددی یک شیء دارای محدوده اسکیما را به نام همان شیء در پایگاه داده تبدیل میکند. در ابزارهای پایش، گزارشهای مدیریتی و تحلیل DMVها معمولاً شناسه شیء دریافت میشود و این تابع آن شناسه را به نام خوانا تبدیل میکند. نکته کلیدی در استفاده از OBJECT_NAME این است که نام خروجی شامل نام Schema نیست؛ برای نام دو بخشی باید SCHEMA_NAME و OBJECT_SCHEMA_NAME را نیز بهکار برد.
مطالعه آموزش مستقل OBJECT_NAME با ۱۰ مثال عملی و خروجی نمونه
OBJECT_ID در SQL Server
تابع OBJECT_ID نام یک شیء پایگاه داده را دریافت میکند و شناسه داخلی آن را برمیگرداند. این تابع برای بررسی وجود جدول یا Stored Procedure، فیلتر کردن DMVها و نوشتن اسکریپتهای استقرار ایمن استفاده میشود. نکته کلیدی در استفاده از OBJECT_ID این است که استفاده از نام بدون Schema ممکن است به شیء اشتباه یا نتیجه NULL منجر شود.
مطالعه آموزش مستقل OBJECT_ID با ۱۰ مثال عملی و خروجی نمونه
DB_NAME در SQL Server
تابع DB_NAME شناسه پایگاه داده را به نام آن تبدیل میکند و بدون پارامتر نام پایگاه داده جاری را میدهد. در گزارشهای چندپایگاهدادهای، پیامهای عیبیابی و خروجی DMVها با کمک این تابع شناسه عددی پایگاه داده به نامی قابل فهم تبدیل میشود. نکته کلیدی در استفاده از DB_NAME این است که کاربر برای مشاهده نام بعضی پایگاههای داده باید مجوز مناسب داشته باشد.
مطالعه آموزش مستقل DB_NAME با ۱۰ مثال عملی و خروجی نمونه
DB_ID در SQL Server
تابع DB_ID نام یک پایگاه داده را به شناسه عددی آن تبدیل میکند و بدون پارامتر شناسه پایگاه داده جاری را برمیگرداند. برای فیلتر DMVها، ارجاع به توابع مدیریتی و کنترل وجود پایگاه داده از DB_ID استفاده میشود. نکته کلیدی در استفاده از DB_ID این است که قبل از ارسال نتیجه به DMVهای پرهزینه، NULL بودن آن را بررسی کنید.
مطالعه آموزش مستقل DB_ID با ۱۰ مثال عملی و خروجی نمونه
گروه 2: فایلها، Filegroup و ظرفیت ذخیرهسازی
FILE_NAME در SQL Server
تابع FILE_NAME شناسه یک فایل در پایگاه داده جاری را به نام منطقی همان فایل تبدیل میکند. این تابع در گزارش مصرف فایل، تحلیل رشد، پشتیبانگیری و نگهداری برای نمایش نام قابل فهم فایل بهجای file_id کاربرد دارد. نکته کلیدی در استفاده از FILE_NAME این است که FILE_NAME فقط در Context پایگاه داده جاری کار میکند.
مطالعه آموزش مستقل FILE_NAME با ۱۰ مثال عملی و خروجی نمونه
FILE_ID در SQL Server
تابع FILE_ID نام منطقی فایل در پایگاه داده جاری را دریافت کرده و شناسه عددی آن فایل را برمیگرداند. از این تابع برای پیوند دادن نام فایل با گزارشهای سیستمی، FILEPROPERTY و عملیات نگهداری استفاده میشود. نکته کلیدی در استفاده از FILE_ID این است که نام ورودی باید نام منطقی باشد و با physical_name اشتباه نشود.
مطالعه آموزش مستقل FILE_ID با ۱۰ مثال عملی و خروجی نمونه
FILEPROPERTY در SQL Server
تابع FILEPROPERTY یک ویژگی مشخص از فایل منطقی پایگاه داده جاری را بهصورت عددی گزارش میکند. محاسبه صفحات مصرفشده، شناسایی فایل اصلی، تشخیص فایل لاگ و کنترل Read-only بودن از مهمترین کاربردهای آن است. نکته کلیدی در استفاده از FILEPROPERTY این است که SpaceUsed بر حسب Page است و برای تبدیل تقریبی به MB باید در 8 ضرب و بر 1024 تقسیم شود.
مطالعه آموزش مستقل FILEPROPERTY با ۱۰ مثال عملی و خروجی نمونه
FILEGROUP_NAME در SQL Server
تابع FILEGROUP_NAME شناسه Filegroup را در پایگاه داده جاری به نام آن تبدیل میکند. در گزارشهای تخصیص ذخیرهسازی، طراحی Partition و تحلیل محل قرارگیری ایندکسها نام Filegroup خواناتر از data_space_id عددی است. نکته کلیدی در استفاده از FILEGROUP_NAME این است که Filegroup با فایل فیزیکی یکی نیست و میتواند چند فایل داشته باشد.
مطالعه آموزش مستقل FILEGROUP_NAME با ۱۰ مثال عملی و خروجی نمونه
جریان دوم نشان میدهد که گزارش حرفهای از ورودی معتبر آغاز میشود، سپس Context و Metadata را کنترل میکند، مقدار را به نوع مناسب تبدیل میسازد و در پایان خروجی خوانا یا Baseline زمانی تولید میکند.
گروه 3: ایندکس و Statistics
INDEXPROPERTY در SQL Server
تابع INDEXPROPERTY ویژگی مشخصی از یک Index یا Statistics وابسته به شیء را بهصورت عددی برمیگرداند. این تابع در اسکریپتهای ممیزی برای تشخیص Unique، Clustered، Hypothetical، Fill Factor و برخی تنظیمات قفلگذاری استفاده میشود. نکته کلیدی در استفاده از INDEXPROPERTY این است که نام Property باید از فهرست رسمی پشتیبانیشده باشد.
مطالعه آموزش مستقل INDEXPROPERTY با ۱۰ مثال عملی و خروجی نمونه
INDEX_COL در SQL Server
تابع INDEX_COL نام ستون کلیدی یک Index را بر اساس شماره ترتیب کلید برمیگرداند. در مستندسازی و تولید گزارش ساده از ساختار ایندکس، میتوان key_idهای متوالی را به نام ستونها تبدیل کرد. نکته کلیدی در استفاده از INDEX_COL این است که این تابع برای ستونهای Included طراحی نشده و تمرکز آن روی کلید است.
مطالعه آموزش مستقل INDEX_COL با ۱۰ مثال عملی و خروجی نمونه
STATS_DATE در SQL Server
تابع STATS_DATE تاریخ و زمان آخرین بهروزرسانی Statistics مشخص روی یک جدول یا View ایندکسشده را برمیگرداند. این تابع برای شناسایی آمار قدیمی، برنامهریزی UPDATE STATISTICS و تحلیل انتخاب Plan نامناسب بسیار کاربردی است. نکته کلیدی در استفاده از STATS_DATE این است که قدیمی بودن زمانی بهتنهایی کافی نیست؛ حجم تغییر داده و حساسیت Query نیز مهم است.
مطالعه آموزش مستقل STATS_DATE با ۱۰ مثال عملی و خروجی نمونه
گروه 4: ویژگیهای Server، Database، Session و Connection
SERVERPROPERTY در SQL Server
تابع SERVERPROPERTY مقدار یکی از ویژگیهای Instance یا موتور SQL Server را بهصورت sql_variant برمیگرداند. تشخیص Edition، Version، نام ماشین، Collation، قابلیت HADR و وضعیت Cluster از کاربردهای متداول آن است. نکته کلیدی در استفاده از SERVERPROPERTY این است که برای مقایسه عددی، sql_variant را به نوع مناسب CAST کنید.
مطالعه آموزش مستقل SERVERPROPERTY با ۱۰ مثال عملی و خروجی نمونه
DATABASEPROPERTYEX در SQL Server
تابع DATABASEPROPERTYEX یک ویژگی مشخص از پایگاه داده نامبرده را بهصورت sql_variant برمیگرداند. کنترل Status، Recovery Model، Collation، Updateability و User Access برای گزارش سلامت و اسکریپتهای استقرار کاربرد دارد. نکته کلیدی در استفاده از DATABASEPROPERTYEX این است که نوع خروجی با Property تغییر میکند و باید در مقایسهها CAST مناسب انجام شود.
مطالعه آموزش مستقل DATABASEPROPERTYEX با ۱۰ مثال عملی و خروجی نمونه
SESSIONPROPERTY در SQL Server
تابع SESSIONPROPERTY وضعیت برخی SET optionهای اثرگذار بر رفتار Query در نشست جاری را گزارش میکند. در عیبیابی تفاوت رفتار بین SSMS و برنامه، کنترل گزینههای لازم برای Indexed View و بررسی ANSI settings استفاده میشود. نکته کلیدی در استفاده از SESSIONPROPERTY این است که تنظیمات Session میتوانند Plan Cache و رفتار خطا را تغییر دهند.
مطالعه آموزش مستقل SESSIONPROPERTY با ۱۰ مثال عملی و خروجی نمونه
CONNECTIONPROPERTY در SQL Server
تابع CONNECTIONPROPERTY اطلاعاتی درباره اتصال جاری مانند Transport، Protocol، Auth Scheme و آدرسهای شبکه میدهد. برای عیبیابی TCP در برابر Shared Memory، بررسی Kerberos یا NTLM و ثبت منبع اتصال در گزارشهای امنیتی مفید است. نکته کلیدی در استفاده از CONNECTIONPROPERTY این است که آدرس Client ممکن است تحت Proxy، Gateway یا Connection Pool معنای متفاوت داشته باشد.
مطالعه آموزش مستقل CONNECTIONPROPERTY با ۱۰ مثال عملی و خروجی نمونه
@@SPID در SQL Server
متغیر سراسری @@SPID شناسه Session یا Server Process ID اتصال جاری را برمیگرداند. این شناسه برای ردیابی Request، درج Correlation ID در لاگ، بررسی Blocking و اتصال به DMVهای نشست استفاده میشود. نکته کلیدی در استفاده از @@SPID این است که SPID پس از پایان Session میتواند برای اتصال دیگری دوباره استفاده شود.
مطالعه آموزش مستقل @@SPID با ۱۰ مثال عملی و خروجی نمونه
گروه 5: شمارندههای تجمعی Instance
@@CPU_BUSY در SQL Server
متغیر @@CPU_BUSY تعداد Tickهای CPU مصرفشده توسط SQL Server از آخرین راهاندازی سرویس را بهصورت تجمعی گزارش میکند. با نمونهبرداری دورهای و محاسبه اختلاف میتوان روند کلی فعالیت CPU موتور را سنجید، هرچند برای تحلیل دقیق Query کافی نیست. نکته کلیدی در استفاده از @@CPU_BUSY این است که مقدار تجمعی است و باید Delta محاسبه شود.
مطالعه آموزش مستقل @@CPU_BUSY با ۱۰ مثال عملی و خروجی نمونه
@@IO_BUSY در SQL Server
متغیر @@IO_BUSY Tickهای زمانی صرفشده توسط SQL Server برای عملیات I/O را از آخرین Startup بهصورت تجمعی ارائه میکند. نمونهبرداری و محاسبه اختلاف آن یک نمای کلی از شدت فعالیت I/O میدهد و میتواند آغاز بررسی عمیقتر فایلها باشد. نکته کلیدی در استفاده از @@IO_BUSY این است که این متغیر Latency هر فایل یا تعداد Read/Write را تفکیک نمیکند.
مطالعه آموزش مستقل @@IO_BUSY با ۱۰ مثال عملی و خروجی نمونه
@@IDLE در SQL Server
متغیر @@IDLE تعداد Tickهای بیکاری SQL Server را از آخرین راهاندازی بهصورت تجمعی گزارش میکند. در کنار @@CPU_BUSY و @@IO_BUSY میتواند برای یک تصویر بسیار کلی از فعالیت و بیکاری Instance نمونهبرداری شود. نکته کلیدی در استفاده از @@IDLE این است که بیکاری موتور با بیکاری کل سرور یکی نیست.
مطالعه آموزش مستقل @@IDLE با ۱۰ مثال عملی و خروجی نمونه
@@PACK_RECEIVED در SQL Server
متغیر @@PACK_RECEIVED تعداد Packetهای شبکه خواندهشده توسط SQL Server از زمان آخرین Startup را گزارش میکند. برای Baseline سبک ترافیک ورودی و مقایسه دورهای با Packetهای ارسالی مفید است. نکته کلیدی در استفاده از @@PACK_RECEIVED این است که Packet با Row یا Request یکسان نیست.
مطالعه آموزش مستقل @@PACK_RECEIVED با ۱۰ مثال عملی و خروجی نمونه
@@PACK_SENT در SQL Server
متغیر @@PACK_SENT تعداد Packetهای شبکه نوشتهشده و ارسالشده توسط SQL Server از آخرین Startup را نشان میدهد. این مقدار برای بررسی روند کلی خروجی شبکه و مقایسه با @@PACK_RECEIVED در Snapshotهای دورهای استفاده میشود. نکته کلیدی در استفاده از @@PACK_SENT این است که تعداد Packet معادل حجم بایت نیست.
مطالعه آموزش مستقل @@PACK_SENT با ۱۰ مثال عملی و خروجی نمونه
@@TOTAL_ERRORS در SQL Server
متغیر @@TOTAL_ERRORS تعداد خطاهای نوشتن روی دیسک را که SQL Server از آخرین Startup مشاهده کرده است، بهصورت تجمعی برمیگرداند. افزایش این شمارنده یک علامت هشدار زیرساختی است و باید با Error Log، Windows Event Log و وضعیت Storage بررسی شود. نکته کلیدی در استفاده از @@TOTAL_ERRORS این است که این متغیر شمارنده همه خطاهای SQL نیست و به خطاهای نوشتن دیسک مربوط است.
مطالعه آموزش مستقل @@TOTAL_ERRORS با ۱۰ مثال عملی و خروجی نمونه
@@TOTAL_READ در SQL Server
متغیر @@TOTAL_READ تعداد عملیات خواندن دیسک انجامشده توسط SQL Server را از آخرین Startup بهصورت تجمعی گزارش میکند. با Deltaگیری دورهای میتوان شدت کلی Read I/O را پایش کرد و تغییر رفتار Workload را دید. نکته کلیدی در استفاده از @@TOTAL_READ این است که این مقدار Logical Read هر Query نیست.
مطالعه آموزش مستقل @@TOTAL_READ با ۱۰ مثال عملی و خروجی نمونه
@@TOTAL_WRITE در SQL Server
متغیر @@TOTAL_WRITE تعداد عملیات نوشتن دیسک SQL Server از آخرین راهاندازی را بهصورت تجمعی برمیگرداند. برای مشاهده روند کلی Write I/O، ارزیابی Jobهای ETL و مقایسه قبل و بعد از تغییرات استفاده میشود. نکته کلیدی در استفاده از @@TOTAL_WRITE این است که این شمارنده Write هر فایل را تفکیک نمیکند.
مطالعه آموزش مستقل @@TOTAL_WRITE با ۱۰ مثال عملی و خروجی نمونه
@@CONNECTIONS در SQL Server
متغیر @@CONNECTIONS تعداد Connection یا Login attemptهای انجامشده به SQL Server از آخرین Startup را بهصورت تجمعی گزارش میکند. Delta این شمارنده برای تشخیص Connection Churn، نبود Pooling یا تغییر ناگهانی الگوی اتصال کاربرد دارد. نکته کلیدی در استفاده از @@CONNECTIONS این است که این مقدار تعداد Connectionهای همزمان فعلی نیست.
مطالعه آموزش مستقل @@CONNECTIONS با ۱۰ مثال عملی و خروجی نمونه
@@TIMETICKS در SQL Server
متغیر @@TIMETICKS تعداد میکروثانیههای هر Tick داخلی SQL Server را برمیگرداند. برای تبدیل شمارندههایی مانند @@CPU_BUSY، @@IO_BUSY و @@IDLE از Tick به واحد زمانی قابل فهم استفاده میشود. نکته کلیدی در استفاده از @@TIMETICKS این است که برای جلوگیری از Overflow در ضرب، یکی از عملوندها را به bigint تبدیل کنید.
مطالعه آموزش مستقل @@TIMETICKS با ۱۰ مثال عملی و خروجی نمونه
جدول مقایسهای تمام توابع و متغیرهای مجموعه
| تابع یا متغیر | کاربرد اصلی | نوع خروجی یا نکته مهم | لینک آموزش کامل |
|---|
| OBJECT_NAME | در ابزارهای پایش، گزارشهای مدیریتی و تحلیل DMVها معمولاً شناسه شیء دریافت میشود و این تابع آن شناسه را به نام خوانا تبدیل میکند. | sysname؛ در صورت نامعتبر بودن شناسه، نبود مجوز مشاهده Metadata یا اشاره نادرست به پایگاه داده مقدار NULL برمیگردد. | آموزش کامل OBJECT_NAME |
| OBJECT_ID | این تابع برای بررسی وجود جدول یا Stored Procedure، فیلتر کردن DMVها و نوشتن اسکریپتهای استقرار ایمن استفاده میشود. | int؛ اگر شیء یافت نشود، نوع آن با فیلتر تطابق نداشته باشد یا مجوز Metadata کافی نباشد، NULL بازگردانده میشود. | آموزش کامل OBJECT_ID |
| DB_NAME | در گزارشهای چندپایگاهدادهای، پیامهای عیبیابی و خروجی DMVها با کمک این تابع شناسه عددی پایگاه داده به نامی قابل فهم تبدیل میشود. | nvarchar(128) یا NULL در صورت شناسه نامعتبر یا محدودیت مجوز مشاهده پایگاه داده. | آموزش کامل DB_NAME |
| DB_ID | برای فیلتر DMVها، ارجاع به توابع مدیریتی و کنترل وجود پایگاه داده از DB_ID استفاده میشود. | int یا NULL اگر نام یافت نشود یا کاربر امکان مشاهده Metadata مربوط را نداشته باشد. | آموزش کامل DB_ID |
| FILE_NAME | این تابع در گزارش مصرف فایل، تحلیل رشد، پشتیبانگیری و نگهداری برای نمایش نام قابل فهم فایل بهجای file_id کاربرد دارد. | nvarchar(128)؛ برای شناسه نامعتبر یا خارج از Context جاری مقدار NULL. | آموزش کامل FILE_NAME |
| FILE_ID | از این تابع برای پیوند دادن نام فایل با گزارشهای سیستمی، FILEPROPERTY و عملیات نگهداری استفاده میشود. | شناسه عددی فایل یا NULL در صورت نبود نام در پایگاه داده جاری. | آموزش کامل FILE_ID |
| FILEPROPERTY | محاسبه صفحات مصرفشده، شناسایی فایل اصلی، تشخیص فایل لاگ و کنترل Read-only بودن از مهمترین کاربردهای آن است. | int؛ مقدار بسته به Property میتواند تعداد Page یا صفر و یک باشد و در ورودی نامعتبر NULL میشود. | آموزش کامل FILEPROPERTY |
| FILEGROUP_NAME | در گزارشهای تخصیص ذخیرهسازی، طراحی Partition و تحلیل محل قرارگیری ایندکسها نام Filegroup خواناتر از data_space_id عددی است. | nvarchar(128) یا NULL در صورت شناسه نامعتبر. | آموزش کامل FILEGROUP_NAME |
| INDEXPROPERTY | این تابع در اسکریپتهای ممیزی برای تشخیص Unique، Clustered، Hypothetical، Fill Factor و برخی تنظیمات قفلگذاری استفاده میشود. | int؛ معمولاً صفر یا یک و برای بعضی Propertyها مقدار عددی مانند عمق یا Fill Factor، و در حالت نامعتبر NULL. | آموزش کامل INDEXPROPERTY |
| INDEX_COL | در مستندسازی و تولید گزارش ساده از ساختار ایندکس، میتوان key_idهای متوالی را به نام ستونها تبدیل کرد. | nvarchar(128) یا NULL برای موقعیت نامعتبر، ایندکس ناموجود یا نوعی که تابع پشتیبانی نمیکند. | آموزش کامل INDEX_COL |
| STATS_DATE | این تابع برای شناسایی آمار قدیمی، برنامهریزی UPDATE STATISTICS و تحلیل انتخاب Plan نامناسب بسیار کاربردی است. | datetime یا NULL اگر Statistics هرگز بهروزرسانی نشده، شیء نامعتبر باشد یا Metadata قابل مشاهده نباشد. | آموزش کامل STATS_DATE |
| SERVERPROPERTY | تشخیص Edition، Version، نام ماشین، Collation، قابلیت HADR و وضعیت Cluster از کاربردهای متداول آن است. | sql_variant؛ نوع واقعی خروجی به Property وابسته است و نام نامعتبر معمولاً NULL میدهد. | آموزش کامل SERVERPROPERTY |
| DATABASEPROPERTYEX | کنترل Status، Recovery Model، Collation، Updateability و User Access برای گزارش سلامت و اسکریپتهای استقرار کاربرد دارد. | sql_variant یا NULL برای Database یا Property نامعتبر و در بعضی محدودیتهای دسترسی. | آموزش کامل DATABASEPROPERTYEX |
| SESSIONPROPERTY | در عیبیابی تفاوت رفتار بین SSMS و برنامه، کنترل گزینههای لازم برای Indexed View و بررسی ANSI settings استفاده میشود. | sql_variant با مقدار معمولاً صفر یا یک؛ برای Option نامعتبر NULL. | آموزش کامل SESSIONPROPERTY |
| CONNECTIONPROPERTY | برای عیبیابی TCP در برابر Shared Memory، بررسی Kerberos یا NTLM و ثبت منبع اتصال در گزارشهای امنیتی مفید است. | sql_variant و برای Property نامعتبر یا ویژگی ناموجود مقدار NULL. | آموزش کامل CONNECTIONPROPERTY |
| @@SPID | این شناسه برای ردیابی Request، درج Correlation ID در لاگ، بررسی Blocking و اتصال به DMVهای نشست استفاده میشود. | smallint و نشاندهنده شناسه نشست فعلی. | آموزش کامل @@SPID |
| @@CPU_BUSY | با نمونهبرداری دورهای و محاسبه اختلاف میتوان روند کلی فعالیت CPU موتور را سنجید، هرچند برای تحلیل دقیق Query کافی نیست. | integer شمارنده Tick؛ برای تبدیل به میکروثانیه از @@TIMETICKS و برای تحلیل نرخ از اختلاف دو Snapshot استفاده میشود. | آموزش کامل @@CPU_BUSY |
| @@IO_BUSY | نمونهبرداری و محاسبه اختلاف آن یک نمای کلی از شدت فعالیت I/O میدهد و میتواند آغاز بررسی عمیقتر فایلها باشد. | integer Tick و قابل تبدیل با @@TIMETICKS. | آموزش کامل @@IO_BUSY |
| @@IDLE | در کنار @@CPU_BUSY و @@IO_BUSY میتواند برای یک تصویر بسیار کلی از فعالیت و بیکاری Instance نمونهبرداری شود. | integer Tick که با @@TIMETICKS قابل تبدیل به زمان است. | آموزش کامل @@IDLE |
| @@PACK_RECEIVED | برای Baseline سبک ترافیک ورودی و مقایسه دورهای با Packetهای ارسالی مفید است. | integer تجمعی. | آموزش کامل @@PACK_RECEIVED |
| @@PACK_SENT | این مقدار برای بررسی روند کلی خروجی شبکه و مقایسه با @@PACK_RECEIVED در Snapshotهای دورهای استفاده میشود. | integer تجمعی. | آموزش کامل @@PACK_SENT |
| @@TOTAL_ERRORS | افزایش این شمارنده یک علامت هشدار زیرساختی است و باید با Error Log، Windows Event Log و وضعیت Storage بررسی شود. | integer تجمعی. | آموزش کامل @@TOTAL_ERRORS |
| @@TOTAL_READ | با Deltaگیری دورهای میتوان شدت کلی Read I/O را پایش کرد و تغییر رفتار Workload را دید. | integer تجمعی. | آموزش کامل @@TOTAL_READ |
| @@TOTAL_WRITE | برای مشاهده روند کلی Write I/O، ارزیابی Jobهای ETL و مقایسه قبل و بعد از تغییرات استفاده میشود. | integer تجمعی. | آموزش کامل @@TOTAL_WRITE |
| @@CONNECTIONS | Delta این شمارنده برای تشخیص Connection Churn، نبود Pooling یا تغییر ناگهانی الگوی اتصال کاربرد دارد. | integer تجمعی. | آموزش کامل @@CONNECTIONS |
| @@TIMETICKS | برای تبدیل شمارندههایی مانند @@CPU_BUSY، @@IO_BUSY و @@IDLE از Tick به واحد زمانی قابل فهم استفاده میشود. | integer نشاندهنده microseconds per tick. | آموزش کامل @@TIMETICKS |
مثالهای ترکیبی و کاربردی
مثال ترکیبی 1: گزارش Context شیء و پایگاه داده
نام و شناسه جدول و Database جاری را در یک ردیف جمع میکنیم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
DECLARE @ObjectId int = OBJECT_ID(N'dbo.Customers', N'U');
SELECT
DB_ID() AS DatabaseId,
DB_NAME() AS DatabaseName,
@ObjectId AS ObjectId,
OBJECT_SCHEMA_NAME(@ObjectId) AS SchemaName,
OBJECT_NAME(@ObjectId) AS ObjectName;
| DatabaseId | DatabaseName | ObjectId | SchemaName | ObjectName |
|---|
| 7 | a00b | 245575913 | dbo | Customers |
این Snapshot برای ثبت Context اجرای Migration یا Job مناسب است. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 2: گزارش ظرفیت فایلهای داده
نام فایل، Filegroup، اندازه، مصرف و فضای آزاد را محاسبه میکنیم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
SELECT
df.file_id,
FILE_NAME(df.file_id) AS LogicalFileName,
FILEGROUP_NAME(df.data_space_id) AS FilegroupName,
CAST(df.size * 8.0 / 1024 AS decimal(18,2)) AS SizeMB,
CAST(FILEPROPERTY(df.name, N'SpaceUsed') * 8.0 / 1024 AS decimal(18,2)) AS UsedMB,
CAST((df.size - FILEPROPERTY(df.name, N'SpaceUsed')) * 8.0 / 1024 AS decimal(18,2)) AS FreeMB
FROM sys.database_files AS df
WHERE df.type = 0;
| file_id | LogicalFileName | FilegroupName | SizeMB | UsedMB | FreeMB |
|---|
| 1 | a00b | PRIMARY | 1024.00 | 780.00 | 244.00 |
فضای آزاد داخلی فایل با فضای آزاد Volume سیستمعامل تفاوت دارد. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 3: ممیزی ویژگی ایندکس
Unique، Clustered و Fill Factor یک ایندکس را بررسی میکنیم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
DECLARE @ObjectId int = OBJECT_ID(N'dbo.Customers', N'U');
DECLARE @IndexName sysname = N'PK_Customers';
SELECT
INDEXPROPERTY(@ObjectId, @IndexName, N'IsUnique') AS IsUnique,
INDEXPROPERTY(@ObjectId, @IndexName, N'IsClustered') AS IsClustered,
INDEXPROPERTY(@ObjectId, @IndexName, N'IndexFillFactor') AS FillFactor,
INDEX_COL(N'dbo.Customers', 1, 1) AS FirstKeyColumn;
| IsUnique | IsClustered | FillFactor | FirstKeyColumn |
|---|
| 1 | 1 | 0 | CustomerId |
برای گزارش همه ایندکسها از sys.indexes و sys.index_columns استفاده کنید. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 4: بررسی تازگی Statistics
زمان Update و تعداد تغییرات Statistics را کنار هم میآوریم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
SELECT s.name AS StatsName,
STATS_DATE(s.object_id, s.stats_id) AS LastUpdated,
p.rows,
p.modification_counter
FROM sys.stats AS s
OUTER APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS p
WHERE s.object_id = OBJECT_ID(N'dbo.Customers');
| StatsName | LastUpdated | rows | modification_counter |
|---|
| IX_Customers_City | 2026-07-10 01:00:00.000 | 250000 | 42000 |
سن Statistics را بدون تعداد تغییرات مبنای تصمیم قرار ندهید. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 5: Snapshot محیط اجرا
ویژگیهای سرور، Database، Session و Connection را یکجا ثبت میکنیم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
SELECT
CONVERT(nvarchar(128), SERVERPROPERTY(N'ProductVersion')) AS ProductVersion,
CONVERT(nvarchar(128), SERVERPROPERTY(N'Edition')) AS Edition,
CONVERT(nvarchar(128), DATABASEPROPERTYEX(DB_NAME(), N'Recovery')) AS RecoveryModel,
SESSIONPROPERTY(N'ARITHABORT') AS ArithAbort,
CONNECTIONPROPERTY(N'net_transport') AS NetTransport,
CONNECTIONPROPERTY(N'auth_scheme') AS AuthScheme,
@@SPID AS SessionId;
| ProductVersion | Edition | RecoveryModel | ArithAbort | NetTransport | AuthScheme | SessionId |
|---|
| 16.0.4125.3 | Developer Edition | FULL | 1 | TCP | KERBEROS | 57 |
این خروجی برای بازتولید تفاوت رفتار بین محیطها ارزشمند است. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 6: Snapshot شمارندههای تجمعی
شمارندههای اصلی Instance را همراه Uptime ثبت میکنیم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
SELECT
CONVERT(bigint, @@CPU_BUSY) AS CpuTicks,
CONVERT(bigint, @@IO_BUSY) AS IoTicks,
CONVERT(bigint, @@IDLE) AS IdleTicks,
CONVERT(bigint, @@TOTAL_READ) AS TotalReads,
CONVERT(bigint, @@TOTAL_WRITE) AS TotalWrites,
CONVERT(bigint, @@CONNECTIONS) AS ConnectionAttempts,
DATEDIFF_BIG(second, sqlserver_start_time, SYSDATETIME()) AS UptimeSeconds
FROM sys.dm_os_sys_info;
| CpuTicks | IoTicks | IdleTicks | TotalReads | TotalWrites | ConnectionAttempts | UptimeSeconds |
|---|
| 1845200 | 928400 | 6248000 | 884200 | 392100 | 154830 | 414300 |
بدون Uptime و Snapshot قبلی، مقادیر تجمعی قابل مقایسه نیستند. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 7: محاسبه Delta CPU و I/O
دو نمونه کوتاه میگیریم و اختلاف Tickها را به زمان تبدیل میکنیم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
DECLARE @CpuBefore bigint = @@CPU_BUSY;
DECLARE @IoBefore bigint = @@IO_BUSY;
WAITFOR DELAY '00:00:02';
SELECT
(@@CPU_BUSY - @CpuBefore) AS CpuTickDelta,
(@@IO_BUSY - @IoBefore) AS IoTickDelta,
CONVERT(bigint, @@CPU_BUSY - @CpuBefore) * @@TIMETICKS AS CpuMicroseconds,
CONVERT(bigint, @@IO_BUSY - @IoBefore) * @@TIMETICKS AS IoMicroseconds;
| CpuTickDelta | IoTickDelta | CpuMicroseconds | IoMicroseconds |
|---|
| 31 | 11 | 310000 | 110000 |
برای Baseline واقعی، فاصله نمونهبرداری ثابت و ذخیرهسازی تاریخچه لازم است. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
مثال ترکیبی 8: مقایسه Packetهای شبکه
Delta Packetهای دریافت و ارسال را در بازه کوتاه اندازه میگیریم. این نمونه چند ابزار از مجموعه Performance Helper Functions را در یک تصمیم عملی کنار هم قرار میدهد.
DECLARE @ReceivedBefore bigint = @@PACK_RECEIVED;
DECLARE @SentBefore bigint = @@PACK_SENT;
WAITFOR DELAY '00:00:02';
SELECT
@@PACK_RECEIVED - @ReceivedBefore AS ReceivedDelta,
@@PACK_SENT - @SentBefore AS SentDelta,
CONNECTIONPROPERTY(N'net_transport') AS NetTransport;
| ReceivedDelta | SentDelta | NetTransport |
|---|
| 146 | 218 | TCP |
Packet معادل Byte یا Query نیست و فقط یک شاخص کلی ترافیک است. در محیط تولید، دسترسیها و نام اشیای واقعی را پیش از اجرا بررسی کنید.
اصول Performance و تفسیر درست خروجی
اصل 1: توابع تبدیل نام و شناسه برای یک مقدار منفرد بسیار خوانا هستند، اما در گزارش هزاران ردیفی بهتر است ستون آماده کاتالوگویو یا Join مستقیم استفاده شود. اجرای Scalar Function روی هر ردیف میتواند هزینه CPU ایجاد کند.
اصل 2: خروجیهای sql_variant مانند SERVERPROPERTY و DATABASEPROPERTYEX باید پیش از مقایسه یا Export به نوع مشخص تبدیل شوند. این کار از تبدیل ضمنی و نتیجه غیرمنتظره در Sort یا Predicate جلوگیری میکند.
اصل 3: شمارندههای @@CPU_BUSY، @@IO_BUSY، @@IDLE، Packetها، Read، Write و Connections از Startup تجمعی هستند. تحلیل حرفهای به دو Snapshot، Delta، زمان بازه و تشخیص Restart نیاز دارد.
اصل 4: مجوز Metadata بخشی از معنای خروجی است. مقدار NULL همیشه به معنی نبود شیء نیست و میتواند ناشی از محدودیت VIEW DEFINITION یا دسترسی به Database دیگر باشد.
اصل 5: برای فایلها، نام منطقی، file_id، مسیر فیزیکی و Filegroup چهار مفهوم جدا هستند. ترکیب نادرست این سطوح، اسکریپت نگهداری را به فایل یا Database اشتباه هدایت میکند.
اصل 6: Statistics را فقط با تاریخ آخرین Update ارزیابی نکنید. تعداد ردیف، modification_counter، الگوی Query و حساسیت Cardinality Estimation باید کنار STATS_DATE تحلیل شوند.
خطاهای رایج در طراحی گزارشهای سیستمی
- ارسال NULL حاصل از OBJECT_ID یا DB_ID به DMV بدون کنترل و اجرای ناخواسته گزارش روی دامنه بزرگ.
- مقایسه رشتهای ProductVersion و نتیجهگیری اشتباه درباره Major Version.
- محاسبه فضای فایل با تقسیم صحیح و حذف بخش اعشاری.
- در نظر گرفتن Packet بهعنوان Byte، Request یا Row.
- ذخیره SPID بهعنوان هویت دائمی کاربر، در حالی که شناسه نشست قابل استفاده مجدد است.
- مقایسه شمارنده تجمعی دو سرور بدون توجه به Uptime و زمان Restart.
تصویر سوم، روشهای پرخطر را با Best Practice مقایسه میکند: اعتبارسنجی ورودی، Deltaگیری، تبدیل نوع صریح، محدودسازی Scope و استفاده از DMV مناسب، پنج پایه گزارش قابل اعتماد هستند.
سؤالات متداول مجموعه Performance Helper Functions
این توابع برای توسعهدهندهاند یا DBA؟
هر دو گروه از آنها استفاده میکنند. توسعهدهنده برای کنترل Deployment و Context، و DBA برای Inventory، پایش و عیبیابی به این ابزارها نیاز دارد.
آیا توابع کمکی جایگزین DMVها هستند؟
خیر. آنها معمولاً یک مقدار هدفمند را تبدیل یا گزارش میکنند، در حالی که DMVها و کاتالوگویوها مجموعه کاملتر و Set-based ارائه میدهند.
چرا بعضی توابع مقدار NULL میدهند؟
شناسه یا نام نامعتبر، Context اشتباه، Property پشتیبانینشده و نبود مجوز مشاهده Metadata از علتهای اصلی NULL هستند.
کدام ابزارها برای گزارش ظرفیت فایل مناسباند؟
FILE_NAME، FILE_ID، FILEPROPERTY، FILEGROUP_NAME و sys.database_files در کنار هم تصویر منطقی و عددی مناسبی میسازند.
برای تحلیل ایندکس از INDEXPROPERTY استفاده کنیم یا sys.indexes؟
برای بررسی یک Property از یک ایندکس INDEXPROPERTY خواناست؛ برای گزارش انبوه، sys.indexes و sys.index_columns بهتر هستند.
آیا STATS_DATE بهتنهایی زمان Update Statistics را تعیین میکند؟
STATS_DATE زمان آخرین Update را میدهد، اما تصمیم Maintenance باید modification_counter، حجم جدول و اثر Query را نیز در نظر بگیرد.
شمارندههای @@ برای مانیتورینگ حرفهای کافیاند؟
برای Baseline سبک مفیدند، ولی برای تحلیل دقیق Query، فایل، Wait و CPU باید DMVها، Query Store، Extended Events یا ابزار مانیتورینگ تکمیلی استفاده شود.
چگونه پروژه گزارشگیری این توابع را طراحی کنیم؟
یک جدول Snapshot با Timestamp و Startup Time بسازید، ورودیها را اعتبارسنجی کنید و نرخها را از Delta محاسبه نمایید. در پروژه سازمانی، Retention و Alert نیز باید طراحی شود.
مهمترین Best Practice این مجموعه چیست؟
هیچ خروجی را بدون Context، نوع داده، زمان Capture و معنای NULL مصرف نکنید.
آیا این آموزش با نسخههای مختلف SQL Server سازگار است؟
هسته توابع در نسخههای رایج وجود دارد، اما Propertyهای خاص، مجوزها و رفتار Azure SQL باید روی پلتفرم مقصد آزمایش شود.
سؤالات مصاحبه برای تسلط بر مجموعه
تفاوت OBJECT_ID و OBJECT_NAME چیست؟
اولی نام را به شناسه و دومی شناسه را به نام تبدیل میکند؛ Schema و مجوز Metadata در هر دو مهماند.
چگونه فضای آزاد داخلی فایل را محاسبه میکنید؟
size از sys.database_files منهای SpaceUsed از FILEPROPERTY، سپس تبدیل Pageهای 8KB به MB.
چرا شمارنده تجمعی را مستقیم مقایسه نمیکنید؟
زیرا Uptime و Restart متفاوت است؛ باید Delta در بازه هماندازه محاسبه شود.
sql_variant چه ملاحظهای دارد؟
قبل از مقایسه یا ذخیره باید به نوع مقصد مناسب CAST یا CONVERT شود.
چه زمانی از DMV بهجای تابع کمکی استفاده میکنید؟
وقتی چند ردیف، چند Property، تاریخچه یا جزئیات Performance نیاز باشد.
جمعبندی و مسیر مطالعه
این مجموعه از ابزارهای کوچک اما بسیار کاربردی تشکیل شده است. مزیت اصلی آنها خواناسازی Metadata، کنترل Context و ساخت Snapshotهای سبک است؛ محدودیت اصلی نیز Scalar بودن، وابستگی به مجوز و تجمعی بودن برخی شمارندههاست.
برای یادگیری عمیق، از جدول مقایسهای یا فهرست دسترسی سریع، مقاله مستقل هر تابع را باز کنید. هر صفحه شامل ۱۰ مثال اجرایی، خروجی نمونه، خطاهای رایج، Performance، FAQ و سؤال مصاحبه است.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستند و قابل توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما