توابع کمکی کارایی و Metadata در SQL Server؛ راهنمای جامع ۲۶ تابع

راهنمای جامع توابع کمکی کارایی و Metadata در SQL Server

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

نظرات 0

راهنمای جامع توابع کمکی کارایی و Metadata در SQL Server

توابع کمکی SQL Server میان داده خام موتور و گزارش قابل فهم قرار می‌گیرند. برخی نام و شناسه اشیا را به یکدیگر تبدیل می‌کنند، برخی ویژگی فایل، ایندکس، Database یا Session را می‌خوانند و گروهی دیگر شمارنده‌های تجمعی Instance را برای ساخت Baseline در اختیار می‌گذارند.

این راهنما ۲۶ تابع و متغیر سیستمی را در پنج گروه عملی بررسی می‌کند. برای هر مورد توضیح مستقل، کاربرد واقعی و لینک مستقیم به مقاله تخصصی قرار گرفته است تا خواننده بتواند از نمای کلی به آموزش عمیق همان ابزار برسد.

اصل مهم این مجموعه آن است که هیچ مقدار سیستمی بدون Context تفسیر نشود. شناسه بدون نام، شمارنده تجمعی بدون Uptime، Property بدون نوع داده و فایل بدون Database جاری می‌تواند گزارشی بسازد که ظاهراً دقیق اما در عمل گمراه‌کننده است.

دسترسی سریع به آموزش‌های مستقل

نقشه مفهومی Performance Helper Functions در SQL Serverنمودار فنی اختصاصی Performance Helper Functions شامل Object Metadata، Database Context، File Capacity، Index & Statistics، Session & ConnectionPerformance Helper FunctionsObject MetadataDatabase ContextFile CapacityIndex & StatisticsSession & Connectionهدف مجموعه، تبدیل داده خام موتور SQL Server به اطلاعات قابل فهم برای گزارش، عیب‌یابی، کنتر

نقشه مفهومی بالا، پنج لایه اصلی این مجموعه را نشان می‌دهد: 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 با ۱۰ مثال عملی و خروجی نمونه

جریان اجرا Performance Helper Functions در SQL Serverنمودار فنی اختصاصی Performance Helper Functions شامل Object Metadata، Database Context، File Capacity، Index & Statistics، Session & ConnectionObject Metadataمرحله 1Database Contextمرحله 2Performance Helper Functionsمرحله 3File Capacityمرحله 4Index & Statisticsمرحله 5ورودی تا خروجی Performance Helper FunctionsSession & ConnectionCumulative Countersخروجی‌ها بسته به ابزار شامل sysname، nvarchar، int، dat

جریان دوم نشان می‌دهد که گزارش حرفه‌ای از ورودی معتبر آغاز می‌شود، سپس 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
@@CONNECTIONSDelta این شمارنده برای تشخیص 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;
DatabaseIdDatabaseNameObjectIdSchemaNameObjectName
7a00b245575913dboCustomers

این 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_idLogicalFileNameFilegroupNameSizeMBUsedMBFreeMB
1a00bPRIMARY1024.00780.00244.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;
IsUniqueIsClusteredFillFactorFirstKeyColumn
110CustomerId

برای گزارش همه ایندکس‌ها از 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');
StatsNameLastUpdatedrowsmodification_counter
IX_Customers_City2026-07-10 01:00:00.00025000042000

سن 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;
ProductVersionEditionRecoveryModelArithAbortNetTransportAuthSchemeSessionId
16.0.4125.3Developer EditionFULL1TCPKERBEROS57

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

مثال ترکیبی 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;
CpuTicksIoTicksIdleTicksTotalReadsTotalWritesConnectionAttemptsUptimeSeconds
18452009284006248000884200392100154830414300

بدون 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;
CpuTickDeltaIoTickDeltaCpuMicrosecondsIoMicroseconds
3111310000110000

برای 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;
ReceivedDeltaSentDeltaNetTransport
146218TCP

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 تحلیل شوند.

خطاهای رایج در طراحی گزارش‌های سیستمی

  1. ارسال NULL حاصل از OBJECT_ID یا DB_ID به DMV بدون کنترل و اجرای ناخواسته گزارش روی دامنه بزرگ.
  2. مقایسه رشته‌ای ProductVersion و نتیجه‌گیری اشتباه درباره Major Version.
  3. محاسبه فضای فایل با تقسیم صحیح و حذف بخش اعشاری.
  4. در نظر گرفتن Packet به‌عنوان Byte، Request یا Row.
  5. ذخیره SPID به‌عنوان هویت دائمی کاربر، در حالی که شناسه نشست قابل استفاده مجدد است.
  6. مقایسه شمارنده تجمعی دو سرور بدون توجه به Uptime و زمان Restart.
سناریوی عملی و بهینه‌سازی Performance Helper Functions در SQL Serverنمودار فنی اختصاصی Performance Helper Functions شامل Object Metadata، Database Context، File Capacity، Index & Statistics، Session & Connectionروش پرخطرBest PracticePerformance Helper Functionsتفسیر شمارنده تجمعی بدون محاسبه Delta و Uptimeتوابع Scalar را نباید بدون محدودسازی روی مجموعتفسیر خام Performance Helper Functionsساخت گزارش InventoryObject MetadataSession & Connection

تصویر سوم، روش‌های پرخطر را با 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

تماس با ما

 

0 نظر

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

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

حرف 500 حداکثر