MS SQL سرور ڈیٹا بیس کی نگرانی کے لیے Zabbix کا استعمال

کردار

ڈیٹا بیس (ڈیٹا بیس) سے متعلق مسائل کے بارے میں اکثر ایڈمنسٹریٹر کو حقیقی وقت میں رپورٹ کرنے کی ضرورت ہوتی ہے۔

یہ مضمون بیان کرے گا کہ MS SQL Server ڈیٹا بیس کی نگرانی کے لیے Zabbix میں کن کنفیگر کرنے کی ضرورت ہے۔

براہ کرم نوٹ کریں کہ ترتیب دینے کے طریقے کے بارے میں تفصیلات نہیں دی جائیں گی، تاہم، فارمولے اور عمومی سفارشات کے ساتھ ساتھ ذخیرہ شدہ طریقہ کار کے ذریعے حسب ضرورت ڈیٹا عناصر کو شامل کرنے کی تفصیلی وضاحت اس مضمون میں دی جائے گی۔
نیز، یہاں صرف اہم کارکردگی کے کاؤنٹرز پر بات کی جائے گی۔

حل

سب سے پہلے، میں ان تمام پرفارمنس کاؤنٹرز کی وضاحت کروں گا (زابکس میں ڈیٹا عناصر کے ذریعے) جن کی ہمیں ضرورت ہے:

  1. منطقی ڈسک
    1. اوسط ڈسک سیکنڈ/پڑھیں۔
      ڈسک سے ڈیٹا پڑھنے کے لیے اوسط وقت دکھاتا ہے، جس کا اظہار سیکنڈوں میں ہوتا ہے۔ اوسط کارکردگی کاؤنٹر اوسط قدر۔ ڈسک سیکنڈ/ریڈ 10 ملی سیکنڈ سے زیادہ نہیں ہونا چاہیے۔ کارکردگی کاؤنٹر کی زیادہ سے زیادہ قیمت اوسط ڈسک سیکنڈ/ریڈ 50 ملی سیکنڈ سے زیادہ نہیں ہونا چاہیے۔

      زبیبس: perf_counter[LogicalDisk(_Total)Avg ڈسک سیکنڈ/ریڈ]، اور مطلوبہ ڈسک کا ٹریک رکھنا بھی ضروری ہے، مثال کے طور پر اس طرح: perf_counter[LogicalDisk(C:)Avg. ڈسک سیکنڈ/پڑھیں]

      ٹرگر مثالیں۔:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg ڈسک سیکنڈ/ریڈ].لاسٹ()}>0.005، لیول ہائی
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg ڈسک سیکنڈ/ریڈ].لاسٹ()}>0.0025، لیول میڈیم

    2. اوسط ڈسک سیکنڈ/لکھیں۔
      ڈسک پر ڈیٹا لکھنے کے لیے اوسط وقت دکھاتا ہے، جس کا اظہار سیکنڈوں میں ہوتا ہے۔ اوسط کارکردگی کاؤنٹر اوسط قدر۔ ڈسک سیکنڈ/لکھنا 10 ملی سیکنڈ سے زیادہ نہیں ہونا چاہیے۔ کارکردگی کاؤنٹر کی زیادہ سے زیادہ قیمت اوسط ڈسک سیکنڈ/لکھنا 50 ملی سیکنڈ سے زیادہ نہیں ہونا چاہیے۔

      زبیبس: perf_counter[LogicalDisk(_Total)Avg Disk sec/Write]، اور مطلوبہ ڈسک کا ٹریک رکھنا بھی ضروری ہے، مثال کے طور پر اس طرح: perf_counter[LogicalDisk(C:)Avg. ڈسک سیکنڈ/لکھیں]

      ٹرگر مثالیں۔:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg Disk sec/Write].last()}>0.005، لیول ہائی
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg Disk sec/Write].last()}>0.0025، لیول میڈیم

    3. اوسط ڈسک قطار کی لمبائی

      ڈسک پر درخواستوں کی قطار کی اوسط لمبائی۔ ایک مخصوص وقت کے وقفے کے اندر زیر التواء ڈسک کی درخواستوں کی تعداد دکھاتا ہے۔ ایک ڈسک کے لیے 2 سے زیادہ کی قطار کو عام سمجھا جاتا ہے۔ اگر قطار میں دو سے زیادہ درخواستیں ہیں، تو ڈسک اوور لوڈ ہو سکتی ہے اور آنے والی درخواستوں پر کارروائی نہیں کر سکتی۔ اوسط کاؤنٹرز کا استعمال کرتے ہوئے آپ یہ جان سکتے ہیں کہ ڈسک کون سے آپریشنز نہیں سنبھال سکتی ہے۔ ڈسک پڑھنے کی قطار کی لمبائی اور اوسط ڈسک رائٹ قطار کی لمبائی (لکھنے کی درخواستوں کی قطار)۔
      اوسط قدر ڈسک کی قطار کی لمبائی کی پیمائش نہیں کی جاتی ہے، لیکن قطار کے ریاضیاتی نظریہ سے لٹل کے قانون کا استعمال کرتے ہوئے شمار کیا جاتا ہے۔ اس قانون کے مطابق، کارروائی کی منتظر درخواستوں کی تعداد، اوسطاً، درخواستوں کی فریکوئنسی کے برابر ہے جو درخواست پر کارروائی کے وقت سے ضرب دی جاتی ہے۔ وہ. ہمارے معاملے میں اوسط ڈسک کی قطار کی لمبائی = (ڈسک کی منتقلی/سیکنڈ) * (اوسط ڈسک سیکنڈ/منتقلی)۔

      اوسط ڈسک کی قطار کی لمبائی ڈسک کے سب سسٹم پر بوجھ کا تعین کرنے کے لیے ایک اہم کاؤنٹر کے طور پر دی گئی ہے، تاہم، اس کا مناسب اندازہ لگانے کے لیے، اسٹوریج سسٹم کی جسمانی ساخت کو درست طریقے سے پیش کرنا ضروری ہے۔ مثال کے طور پر، ایک ہارڈ ڈرائیو کے لیے 2 سے زیادہ کی قدر کو اہم سمجھا جاتا ہے، اور اگر ڈسک 4 ڈسکوں کی RAID سرنی پر واقع ہے، تو آپ کو فکر کرنی چاہیے کہ کیا قدر 4*2=8 سے زیادہ ہے۔

      زبیبس: perf_counter[LogicalDisk(_Total)Avg ڈسک کی قطار کی لمبائی]، اور مطلوبہ ڈسک کا ٹریک رکھنا بھی ضروری ہے، مثال کے طور پر اس طرح: perf_counter[LogicalDisk(C:)Avg. ڈسک کی قطار کی لمبائی]

  2. یاد داشت
    1. صفحات/سیکنڈ
      ان صفحات کی تعداد دکھاتا ہے جنہیں SQL سرور نے ڈسک سے پڑھا یا میموری کے صفحات تک رسائی کو حل کرنے کے لیے ڈسک پر لکھا جو رسائی کے وقت RAM میں لوڈ نہیں ہوئے تھے۔ یہ ویلیو پیجز ان پٹ/سیکنڈ اور پیجز آؤٹ پٹ/سیکنڈ کا مجموعہ ہے، اور ایپلیکیشن ڈیٹا فائلوں تک رسائی کے لیے سسٹم کیش کی پیجنگ (پیجنگ/سواپنگ) کو بھی مدنظر رکھتی ہے۔ اس کے علاوہ، اس میں نان کیشڈ فائلوں کی پیجنگ بھی شامل ہے جو براہ راست میموری میں میپ کی گئی ہیں۔ یہ وہ اہم کاؤنٹر ہے جس کی نگرانی کی جانی چاہیے اگر آپ کو میموری کے زیادہ استعمال اور اس سے منسلک ضرورت سے زیادہ پیجنگ کا سامنا ہے۔ یہ کاؤنٹر تبادلہ کی مقدار کو ظاہر کرتا ہے اور اس کی عام (چوٹی نہیں) قدر صفر کے قریب ہونی چاہیے۔ تبادلہ میں اضافہ RAM بڑھانے یا سرور پر چلنے والے ایپلیکیشن پروگراموں کی تعداد کو کم کرنے کی ضرورت کی نشاندہی کرتا ہے۔

      زبیبس: perf_counter[MemoryPages/sec] ٹرگر مثال:
      {NODE_NAME:perf_counter[MemoryPages/sec].min(5m)}>1000، سطح کی معلومات

    2. صفحہ کی خرابیاں/سیکنڈ

      یہ صفحہ فالٹ کاؤنٹر ویلیو ہے۔ صفحہ کی خرابی اس وقت ہوتی ہے جب کوئی عمل ایک ورچوئل میموری پیج کا حوالہ دیتا ہے جو RAM کے ورکنگ سیٹ میں نہیں ہے۔ یہ کاؤنٹر صفحہ کی ان دونوں خرابیوں کو مدنظر رکھتا ہے جن کے لیے ڈسک تک رسائی کی ضرورت ہوتی ہے، اور وہ جو صفحہ RAM میں ورکنگ سیٹ سے باہر ہونے کی وجہ سے ہوتی ہیں۔ زیادہ تر پروسیسرز بغیر کسی تاخیر کے ٹائپ XNUMX صفحہ کی خرابیوں کو سنبھال سکتے ہیں۔ تاہم، صفحہ XNUMX کی قسم کی خرابیوں کو سنبھالنا جن کے لیے ڈسک تک رسائی کی ضرورت ہوتی ہے اہم تاخیر کا سبب بن سکتا ہے۔

      زبیبس: perf_counter[میموری پیج فالٹس/سیکنڈ] ٹرگر مثال:
      {NODE_NAME:perf_counter[MemoryPage Faults/sec].min(5m)}>1000، سطح کی معلومات

    3. دستیاب بائٹس

      مختلف عملوں کو چلانے کے لیے بائٹس میں دستیاب میموری کی مقدار کا ٹریک رکھتا ہے۔ کم پڑھنا کم میموری کی نشاندہی کرتا ہے۔ اس کا حل یادداشت کو بڑھانا ہے۔ یہ میٹر زیادہ تر معاملات میں مسلسل 5000 kV سے اوپر ہونا چاہیے۔
      مندرجہ ذیل وجوہات کی بنا پر دستی طور پر دستیاب Mbytes کے لیے حد مقرر کرنا سمجھ میں آتا ہے۔

      •50% مفت میموری دستیاب = بہترین
      •25% دستیاب میموری = توجہ کی ضرورت ہے۔
      •10% مفت = ممکنہ مسائل
      •5% سے کم دستیاب میموری = رفتار کے لیے اہم، آپ کو مداخلت کرنے کی ضرورت ہے۔
      زبیبس: perf_counter[میموری دستیاب بائٹس]

  3. پروسیسر (کل): % پروسیسر کا وقت
    یہ کاؤنٹر اس وقت کا فیصد دکھاتا ہے جب پروسیسر غیر فعال دھاگوں کے لیے کارروائیوں کو انجام دینے میں مصروف تھا۔ اس قدر کو مفید کام کرنے میں صرف کیے گئے وقت کے تناسب کے طور پر سمجھا جا سکتا ہے۔ ہر پروسیسر کو ایک بیکار دھاگے کو تفویض کیا جا سکتا ہے، جو غیر پیداواری پروسیسر سائیکلوں کو استعمال کرتا ہے جو دوسرے دھاگوں کے ذریعہ استعمال نہیں ہوتے ہیں۔ یہ کاؤنٹر مختصر چوٹیوں کی خصوصیت رکھتا ہے جو 100 فیصد تک پہنچ سکتی ہے۔ تاہم، اگر پروسیسر کا استعمال 80 فیصد سے زیادہ ہے، تو مزید پروسیسرز کا استعمال کرتے ہوئے نظام زیادہ موثر ہوگا۔

    زبیبس: perf_counter[Processor(_Total)% پروسیسر ٹائم]، یہاں اسے بنیادی طور پر بھی دکھایا جا سکتا ہے
    ٹرگر مثال:
    {NODE_NAME:perf_counter[Processor(_Total)% پروسیسر ٹائم].min(5m)}>80، سطح کی معلومات

  4. نیٹ ورک انٹرفیس (*): % بائٹس کل/سیکنڈ
    تمام انٹرفیسز میں فی سیکنڈ بھیجے اور موصول ہونے والے بائٹس کی کل تعداد۔ یہ انٹرفیس بینڈوتھ (بائٹس میں) ہے۔ اس کاؤنٹر کی قدر کا موازنہ نیٹ ورک کارڈ کی زیادہ سے زیادہ بینڈوتھ سے کرنا ضروری ہے۔ عام طور پر، اس کاؤنٹر کو نیٹ ورک اڈاپٹر بینڈوتھ کا 50% سے زیادہ استعمال نہیں دکھانا چاہیے۔
    زبیبس: perf_counter[نیٹ ورک انٹرفیس(*)Bytes Sent/sec]
  5. MS SQL سرور: رسائی کے طریقے
    ایس کیو ایل سرور میں رسائی کے طریقے آبجیکٹ ڈیٹا بیس کے اندر منطقی ڈیٹا تک رسائی کو ٹریک کرنے میں مدد کے لیے کاؤنٹرز فراہم کرتا ہے۔ ڈسک پر ڈیٹا بیس کے صفحات تک جسمانی رسائی کو بفر مینیجر کاؤنٹرز کے ذریعے کنٹرول کیا جاتا ہے۔ ڈیٹا بیس میں ڈیٹا تک رسائی کے طریقوں کی نگرانی کرنے سے اس بات کا تعین کرنے میں مدد ملتی ہے کہ آیا انڈیکسز کو شامل کرکے یا تبدیل کرکے، پارٹیشنز کو شامل کرکے یا منتقل کرکے، فائلوں یا فائلوں کے گروپس کو شامل کرکے، انڈیکس کو ڈیفراگمنٹ کرکے، یا استفسار کے متن کو تبدیل کرکے استفسار کی کارکردگی کو بہتر بنایا جاسکتا ہے۔ مزید برآں، آپ اپنے ڈیٹا بیس میں ڈیٹا، اشاریہ جات، اور خالی جگہ کے سائز، نگرانی کی صلاحیت اور ہر سرور مثال کے لیے فریگمنٹیشن کی نگرانی کے لیے رسائی کے طریقے آبجیکٹ کاؤنٹرز استعمال کر سکتے ہیں۔ ضرورت سے زیادہ انڈیکس فریگمنٹیشن کارکردگی کو نمایاں طور پر کم کر سکتا ہے۔

    1. صفحہ کی تقسیم/سیکنڈ
      صفحہ کی تقسیم کی تعداد فی سیکنڈ انڈیکس صفحہ اوور فلو کے نتیجے میں انجام دی گئی ہے۔ اس میٹرک کے لیے ایک اعلی قدر کا مطلب یہ ہے کہ ڈیٹا پر داخل اور اپ ڈیٹ کی کارروائیوں کو انجام دیتے وقت، ایس کیو ایل سرور کو صفحات کو تقسیم کرنے اور موجودہ صفحہ کے کچھ حصے کو نئی جگہ پر منتقل کرنے کے لیے وسائل سے بھرپور کارروائیوں کی ایک بڑی تعداد کو انجام دینا چاہیے۔ جب بھی ممکن ہو ایسے آپریشنوں سے گریز کیا جانا چاہیے۔ آپ مسئلہ کو دو طریقوں سے حل کرنے کی کوشش کر سکتے ہیں:
      - خود بخود بڑھنے والے کالموں کے لیے ایک کلسٹرڈ انڈیکس بنائیں۔ اس صورت میں، نئے ریکارڈ پہلے سے ڈیٹا کے زیر قبضہ صفحات کے اندر نہیں رکھے جائیں گے، بلکہ ترتیب وار نئے صفحات پر قبضہ کریں گے۔
      - فل فیکٹر پیرامیٹر کی قدر میں اضافہ کرکے اشاریہ جات کو دوبارہ بنائیں۔ یہ آپشن آپ کو انڈیکس والے صفحات میں خالی جگہ محفوظ کرنے کی اجازت دیتا ہے جو کہ صفحہ تقسیم کرنے کی کارروائیوں کی ضرورت کے بغیر نئے ڈیٹا کو ایڈجسٹ کرنے کے لیے استعمال کیا جائے گا۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Acess MethodsPage Splits/sec",30] ٹرگر مثال: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Access MethodsPage Splits/sec",30].last()}>{NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsBatch Requests/sec",30)}la. /5، سطح کی معلومات
    2. مکمل اسکینز/سیکنڈ
      فی سیکنڈ مکمل اسکینوں کی لامحدود تعداد۔ ان آپریشنز میں مین ٹیبل اسکین اور مکمل انڈیکس اسکین شامل ہیں۔ اس اشارے میں مستحکم اضافہ نظام کی تنزلی کی نشاندہی کرسکتا ہے (ضروری اشاریہ جات کی کمی، ان کی شدید تقسیم، موجودہ اشاریہ جات کو استعمال کرنے میں اصلاح کار کی ناکامی، غیر استعمال شدہ اشاریہ جات کی موجودگی)۔ تاہم، یہ بات قابل غور ہے کہ چھوٹے ٹیبلز میں مکمل اسکین کرنا ہمیشہ برا نہیں ہوتا، کیونکہ اگر آپ پوری ٹیبل کو RAM میں رکھ سکتے ہیں، تو مکمل اسکین تیزی سے ہوگا۔ لیکن زیادہ تر معاملات میں، اس کاؤنٹر میں مستحکم اضافہ نظام کی تنزلی کی نشاندہی کرے گا۔ یہ سب صرف OLTP سسٹمز پر لاگو ہوتا ہے۔ OLAP سسٹمز میں، مسلسل مکمل اسکین معمول کی بات ہے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME: رسائی کے طریقے مکمل اسکینز/سیکنڈ"، 30]

  6. ایم ایس ایس کیو ایل سرور: بفر مینیجر
    بفر مینیجر آبجیکٹ کاؤنٹر فراہم کرتا ہے جو آپ کو نگرانی کرنے میں مدد کرتا ہے کہ SQL سرور درج ذیل وسائل کو کس طرح استعمال کرتا ہے۔
    - ڈیٹا کے صفحات کو ذخیرہ کرنے کے لیے میموری؛
    - ایسے کاؤنٹرز جو فزیکل I/O کی نگرانی کرتے ہیں جیسا کہ SQL سرور ڈیٹا بیس کے صفحات کو پڑھتا اور لکھتا ہے۔
    - تیز غیر مستحکم میموری کا استعمال کرتے ہوئے بفر کیشے کو بڑھانے کے لیے بفر پول کی توسیع، جیسے سالڈ اسٹیٹ ڈرائیوز (SSD)؛
    - SQL سرور کی طرف سے استعمال کی جانے والی میموری اور کاؤنٹرز کی نگرانی درج ذیل معلومات حاصل کرنے میں مدد کرتی ہے۔
    - چاہے جسمانی میموری کی کمی کی وجہ سے رکاوٹیں ہوں۔ اگر کثرت سے رسائی شدہ ڈیٹا کو کیشے میں محفوظ نہیں کیا جا سکتا ہے، تو SQL سرور اسے ڈسک سے پڑھنے پر مجبور کیا جاتا ہے۔
    کیا میموری کی مقدار میں اضافہ کرکے یا ڈیٹا کیش یا اندرونی SQL سرور ڈھانچے کو ذخیرہ کرنے کے لیے اضافی میموری مختص کرکے استفسار کی کارکردگی کو بہتر بنانا ممکن ہے؟
    - SQL سرور کتنی بار ڈسک سے ڈیٹا پڑھتا ہے۔ دیگر آپریشنز جیسے کہ میموری تک رسائی کے مقابلے میں، جسمانی I/O کو مکمل ہونے میں زیادہ وقت لگتا ہے۔ I/O کو کم کرنے سے استفسار کی کارکردگی بہتر ہو سکتی ہے۔

    1. بفر کیشے ہٹ ریڈیو
      اس بات کی نشاندہی کرتا ہے کہ SQL سرور کیش بفر میں کتنا ڈیٹا فٹ ہو سکتا ہے۔ یہ قدر جتنی زیادہ ہے، اتنا ہی بہتر، کیونکہ ایس کیو ایل سرور کے لیے ڈیٹا کے صفحات تک مؤثر طریقے سے رسائی حاصل کرنے کے لیے، ان کا کیشے بفر میں ہونا چاہیے، اور کوئی فزیکل ان پٹ/آؤٹ پٹ (I/O) آپریشن نہیں ہونا چاہیے۔ اگر آپ کو اس کاؤنٹر کی اوسط قدر میں مسلسل کمی نظر آتی ہے، تو آپ کو رام شامل کرنے پر غور کرنا چاہیے۔ یہ اشارے ہمیشہ OLTP سسٹمز کے لیے 90% سے اوپر اور OLAP سسٹمز کے لیے 50% سے اوپر ہونا چاہیے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer کیش ہٹ ریشو"،30] ٹرگر مثالیں۔: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30].last()}<70, level-high
      и
      {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30].last()}<80, level-medium
    2. صفحہ زندگی کی توقع
      دکھاتا ہے کہ صفحہ اپنی موجودہ حالت میں کتنی دیر تک میموری میں مستقل طور پر رہے گا۔ اگر قیمت گرتی رہتی ہے، تو اس کا مطلب ہے کہ سسٹم بفر پول کا غلط استعمال کر رہا ہے۔ لہذا، میموری کی کارکردگی ممکنہ طور پر خراب کارکردگی کے نتیجے میں مسائل کا سبب بن سکتی ہے۔ یہ بات قابل غور ہے کہ ایسا کوئی عالمگیر اشارے نہیں ہے جس کے نیچے کوئی واضح طور پر فیصلہ کر سکے کہ سسٹم بفر پول کا غلط استعمال کر رہا ہے (MS SQL Server 300 کے بعد سے 2012 سیکنڈ کا انڈیکیٹر پرانا ہے)۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage کی متوقع عمر"،30] ٹرگر مثال: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage لائف متوقع",30].last()}<5, سطح کی معلومات

  7. ایم ایس ایس کیو ایل سرور: جنرل شماریات
    ایس کیو ایل سرور میں جنرل شماریات آبجیکٹ ایسے کاؤنٹرز فراہم کرتا ہے جو آپ کو سرور کی مجموعی سرگرمی کی نگرانی کرنے کی اجازت دیتے ہیں، جیسے کنکرنٹ کنکشنز کی تعداد اور ایس کیو ایل سرور کی مثال چلانے والے کمپیوٹر سے منسلک یا منقطع ہونے والے فی سیکنڈ صارفین کی تعداد۔ یہ میٹرکس بڑے آن لائن ٹرانزیکشن پروسیسنگ (OLTP) سسٹمز میں کارآمد ہیں جہاں کلائنٹس کی ایک بڑی تعداد SQL سرور کی مثال سے مسلسل منسلک اور منقطع ہو رہی ہے۔

    1. عمل مسدود ہے۔
      فی الحال مسدود عملوں کی تعداد۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses مسدود"،30] ٹرگر مثال: ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses بلاک کر دیے گئے" 30].min(2m,0)}>=0)
      اور ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses بلاک کر دیا گیا"، 30].time(0)}>=50000)
      اور ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses blocked",30].time(0)}<=230000)، معلومات کی سطح (یہاں 05:00 سے 23:00 تک سگنلنگ کی پابندی ہے)
    2. صارف کے رابطے
      فی الحال SQL سرور سے منسلک صارفین کی تعداد۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:عام اعدادوشمار یوزر کنکشنز"،30]

  8. MS SQL سرور: تالے
    مائیکروسافٹ ایس کیو ایل سرور میں لاک آبجیکٹ انفرادی وسائل کی اقسام کے لیے حاصل کیے گئے SQL سرور تالے کے بارے میں معلومات فراہم کرتا ہے۔ ایک ہی وقت میں وسائل کے استعمال سے متعدد ٹرانزیکشنز کو روکنے کے لیے SQL سرور کے وسائل پر لاک جاری کیے جاتے ہیں، جیسے کہ قطاروں کو پڑھا یا تبدیل کیا جاتا ہے۔ مثال کے طور پر، اگر ایک خصوصی (X) لاک ٹیبل میں ایک قطار میں ٹرانزیکشن کے ذریعے حاصل کیا جاتا ہے، تو کوئی دوسرا لین دین اس قطار کو تب تک تبدیل نہیں کر سکتا جب تک کہ لاک جاری نہ ہو جائے۔ تالے کے استعمال کو کم کرنے سے ہم آہنگی میں اضافہ ہوتا ہے، جو مجموعی کارکردگی کو بہتر بنا سکتا ہے۔ Locks آبجیکٹ کی کئی مثالیں ایک ہی وقت میں ٹریک کی جا سکتی ہیں، جن میں سے ہر ایک الگ قسم کے وسائل پر ایک لاک کی نمائندگی کرے گا۔

    1. اوسط انتظار کا وقت (ms)
      ان تمام لاک درخواستوں کے لیے اوسط انتظار کا دورانیہ (ملی سیکنڈ میں) جس کے لیے انتظار کی ضرورت تھی۔ یہ کاؤنٹر ظاہر کرتا ہے کہ اوسطاً، صارف کے عمل کو کسی وسائل پر تالا حاصل کرنے کے لیے کتنی دیر تک قطار میں انتظار کرنا پڑتا ہے۔ اس کاؤنٹر کی زیادہ سے زیادہ قابل اجازت قیمت مکمل طور پر آپ کے کام پر منحصر ہے؛ تمام ایپلی کیشنز کے لیے کسی اوسط قدر کا تعین کرنا مشکل ہے۔ اگر یہ کاؤنٹر بہت زیادہ ہے، تو یہ آپ کے ڈیٹا بیس میں لاک کرنے کے مسائل کی نشاندہی کر سکتا ہے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)اوسط انتظار کا وقت (ms)",30] ٹرگر مثال: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)اوسط انتظار کا وقت (ms)",30].last()}>=500، سطح کی معلومات
    2. مقفل انتظار کا وقت (ms)
      آخری سیکنڈ میں کل لاک انتظار کا وقت (ملی سیکنڈ میں)۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Wait Time (ms)",30]
    3. مقفل انتظار/سیکنڈ
      آخری سیکنڈ میں جتنی بار ایک تھریڈ کو لاک کی درخواست کی وجہ سے انتظار کرنا پڑا۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Waits/sec",30]
    4. لاک ٹائم آؤٹ/سیکنڈ
      جتنی بار راؤنڈ رابن کے ذریعے لاک حاصل نہیں کیا جا سکتا۔ ایس کیو ایل سرور اسپن کاؤنٹر کنفیگریشن پیرامیٹر ویلیو اس بات کا تعین کرتی ہے کہ دھاگے کے ختم ہونے اور تھریڈ کے غیر فعال ہونے سے پہلے کتنی بار گھمایا جا سکتا ہے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Timeouts/sec",30] ٹرگر مثال: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Locks(_Total)Lock Timeouts/sec",30].last()}>1000، سطح کی معلومات
    5. لاک درخواستیں/سیکنڈ
      مخصوص لاک قسم کی فی سیکنڈ درخواستوں کی تعداد۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Requests/sec",30] ٹرگر مثال: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Requests/sec",30].last()}>500000، سطح کی معلومات
    6. ڈیڈ لاک کی تعداد/سیکنڈ
      فی سیکنڈ لاک کی درخواستوں کی تعداد جس کے نتیجے میں تعطل پیدا ہوتا ہے۔ تعطل کی موجودگی ناقص استفسارات کی نشاندہی کرتی ہے جو مشترکہ وسائل کو روک رہے ہیں۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME: ڈیڈ لاک کی تعداد/سیکنڈ"، 30] ٹرگر مثال: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Deadlocks/sec کی تعداد"30].last()}>1، لیول ہائی

  9. ایم ایس ایس کیو ایل سرور: میموری مینیجر
    مائیکروسافٹ ایس کیو ایل سرور میں میموری مینیجر آبجیکٹ سرور کے وسیع میموری کے استعمال کی نگرانی کے لیے کاؤنٹرز فراہم کرتا ہے۔ صارف کی سرگرمی اور وسائل کے استعمال کا جائزہ لینے کے لیے پورے سرور کے میموری کے استعمال کی نگرانی کارکردگی کی رکاوٹوں کی شناخت میں مدد کر سکتی ہے۔ ایس کیو ایل سرور کی ایک مثال کے ذریعہ استعمال ہونے والی میموری کی نگرانی کا تعین کرنے میں مدد مل سکتی ہے:
    - چاہے کیشے میں اکثر استعمال ہونے والے ڈیٹا کو ذخیرہ کرنے کے لیے ناکافی جسمانی میموری کی کمی ہو۔ اگر کافی میموری نہیں ہے تو، SQL سرور کو ڈسک سے ڈیٹا لانا چاہیے۔
    - کیا استفسار کی کارکردگی بہتر ہو سکتی ہے اگر میموری کو شامل کیا جائے یا ڈیٹا کیشنگ یا اندرونی SQL سرور ڈھانچے کے لیے دستیاب میموری کی مقدار میں اضافہ کیا جائے۔

    1. میموری گرانٹس بقایا
      ان عملوں کی کل تعداد کی نشاندہی کرتا ہے جنہوں نے ورک اسپیس میموری کو کامیابی سے حاصل کیا۔ اگر اشارے مسلسل گرتا ہے، تو RAM کو بڑھانا ضروری ہے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:میموری مینیجرمیموری گرانٹس بقایا"،30]
    2. میموری گرانٹس زیر التواء
      ورکنگ میموری کو مختص کیے جانے کے منتظر عملوں کی کل تعداد کی نشاندہی کرتا ہے۔ اشارے کی مستحکم ترقی کے ساتھ، رام کو بڑھانا ضروری ہے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:میموری مینیجرمیموری گرانٹس زیر التواء"،30]

  10. ایم ایس ایس کیو ایل سرور: شماریات
    مائیکروسافٹ ایس کیو ایل سرور میں شماریات آبجیکٹ ایس کیو ایل سرور کی مثال پر بھیجے گئے سوالات کی تالیف اور اقسام کی نگرانی کے لیے کاؤنٹر فراہم کرتا ہے۔ استفسارات کی تالیفات اور دوبارہ ترتیب دینے کی تعداد اور SQL سرور کی ایک مثال کے ذریعے موصول ہونے والے بیچوں کی تعداد کی نگرانی کرنا اس بات کی بصیرت فراہم کرتا ہے کہ SQL سرور صارف کے سوالات کو کتنی تیزی سے انجام دیتا ہے اور استفسار کی اصلاح کرنے والا ان پر کتنی مؤثر طریقے سے کارروائی کرتا ہے۔

    1. بیچ کی درخواستیں/سیکنڈ
      Transact-SQL کمانڈ پیکٹ کی تعداد فی سیکنڈ موصول ہوئی۔ یہ اعدادوشمار کسی بھی حدود سے متاثر ہوتے ہیں (I/O، صارفین کی تعداد، کیش سائز، استفسار کی پیچیدگی، وغیرہ)۔ پیکٹ کی درخواستوں کی ایک بڑی تعداد اعلی تھرو پٹ کی نشاندہی کرتی ہے۔
      زبیبس: perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsBatch Requests/sec",30]

مندرجہ بالا سبھی کے علاوہ، آپ ڈیٹا کے دیگر عناصر کو بھی ترتیب دے سکتے ہیں (نیز بعد میں آنے والی اطلاعات کے ساتھ ان پر محرکات بھی بنا سکتے ہیں)۔ مثال کے طور پر:
1) مفت ڈسک کی جگہ کی مقدار
2) ڈیٹا بیس ڈیٹا فائلوں اور لاگز کے سائز
میں. د.
تاہم، یہ تمام اشارے ریئل ٹائم سوالات کا مسئلہ نہیں دکھاتے ہیں۔
ایسا کرنے کے لیے، آپ کو اپنے خصوصی کاؤنٹر بنانے کی ضرورت ہے۔
رازداری کی وجوہات کی بناء پر، میں ایسے شمار کنندگان کی مثالیں نہیں دوں گا۔ مزید یہ کہ، وہ ہر نظام کے لیے منفرد طور پر ترتیب دیے گئے ہیں۔ لیکن میں نوٹ کرتا ہوں کہ 1C، NAV اور CRM جیسے سسٹمز کے لیے متعلقہ ڈویلپرز کے ساتھ مل کر خصوصی کاؤنٹر بنائے جا سکتے ہیں۔
میں ایک عمومی اشارے بنانے کی ایک مثال دوں گا جو دکھاتا ہے کہ کتنی درخواستیں چل رہی ہیں اور کتنی درخواستیں زیر التواء ہیں (معطل یا بلاک شدہ) وقت کے ہر ایک مقام پر۔
ایسا کرنے کے لیے، آپ کو ایک ذخیرہ شدہ طریقہ کار بنانا ہوگا:
کوڈ

USE [ИМЯ_БАЗЫ_ДАННЫХ]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [nav].[ZabbixGetCountRequestStatus]
	@Status nvarchar(255)
AS
BEGIN
	/*
		возвращает кол-во запросов с заданным статусом
	*/
	SET NOCOUNT ON;

	select count(*) as [Count]
	from sys.dm_exec_requests ER with(readuncommitted)
	where [status]=@Status
END

اس کے بعد، آپ کو اس فولڈر میں جانے کی ضرورت ہے جہاں Zabbix واقع ہے (zabbixconfuserparams.d) اور ایکسٹینشن ps2 (PowerShell) کے ساتھ 1 فائلیں بنائیں اور ان میں سے ہر ایک میں درج ذیل کوڈز لکھیں:
سوالات چلانے کے لیے کوڈ

$SQLServer = "НАЗВАНИЕ_ЭКЗЕМПЛЯРА";
$uid = "ЛОГИН"; 
$pwd = "ПАРОЛЬ";
$Status="running";

$connectionString = "Server = $SQLServer; Database=НАЗВАНИЕ_БД; Integrated Security = False; User ID = $uid; Password = $pwd;";

$connection = New-Object System.Data.SqlClient.SqlConnection;
$connection.ConnectionString = $connectionString;

#Создаем запрос непосредственно к MSSQL / Create a request directly to MSSQL
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure;  
$SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus";
$SqlCmd.Connection = $Connection;

$paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar);
$paramStatus.Value = $Status;

$connection.Open();
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlAdapter.SelectCommand = $SqlCmd;
$DataSet = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet) > $null;
$connection.Close();

$result = $DataSet.Tables[0].Rows[0]["Count"];

write-host $result;

زیر التواء درخواستوں کا کوڈ

$SQLServer = "НАЗВАНИЕ_ЭКЗЕМПЛЯРА";
$uid = "ЛОГИН"; 
$pwd = "ПАРОЛЬ";
$Status="suspended";

$connectionString = "Server = $SQLServer; Database=НАЗВАНИЕ_БД; Integrated Security = False; User ID = $uid; Password = $pwd;";

$connection = New-Object System.Data.SqlClient.SqlConnection;
$connection.ConnectionString = $connectionString;

#Создаем запрос непосредственно к MSSQL / Create a request directly to MSSQL
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure;  
$SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus";
$SqlCmd.Connection = $Connection;

$paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar);
$paramStatus.Value = $Status;

$connection.Open();
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlAdapter.SelectCommand = $SqlCmd;
$DataSet = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet) > $null;
$connection.Close();

$result = $DataSet.Tables[0].Rows[0]["Count"];

write-host $result;

اب آپ کو صارف کے پیرامیٹرز اور .conf ایکسٹینشن کے ساتھ ایک فائل بنانے کی ضرورت ہے (یا ایسی موجودہ صارف فائل میں لائنیں شامل کریں، اگر کوئی پہلے بنائی گئی ہو) اور درج ذیل لائنیں داخل کریں:
UserParameter=PARAMETER_NAME_NUMBER_of_QUERIES EXECUTED،powershell -NoProfile -ExecutionPolicy بائی پاس -FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_EXECUTED_QUERYES.ps1
UserParameter=PARAMETER_NAME_NUMBER_WAITING_REQUESTS،powershell -NoProfile -ExecutionPolicy bypass -FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_WAITING_REQUESTS.ps1
اس کے بعد، .conf فائل کو محفوظ کریں اور Zabbix ایجنٹ کو دوبارہ شروع کریں۔
اس کے بعد، ہم Zabbix میں دو نئے عناصر شامل کرتے ہیں (اس معاملے میں، نام اور کلید ایک جیسے ہیں):
PARAMETER_NAME_NUMBER OF_REQUESTS پرفارمڈ
PARAMETER_NAME_NUMBER OF_WAITING_REQUESTS
اب آپ تخلیق کردہ حسب ضرورت ڈیٹا آئٹمز کے لیے گراف اور محرکات بنا سکتے ہیں۔

اگر زیر التواء درخواستوں کی تعداد میں تیزی سے اضافہ ہوتا ہے، تو درج ذیل استفسار ایک مقررہ وقت پر تمام چل رہی اور زیر التواء درخواستوں کو اس تفصیلات کے ساتھ ظاہر کر سکتا ہے کہ درخواست کہاں سے اور کس لاگ ان کے تحت عمل میں لائی گئی، متن اور استفسار کا منصوبہ، نیز دیگر تفصیلات:
کوڈ

/*Активные, готовые к выполнению и ожидающие запросы, а также те, что явно блокируют другие сеансы*/
with tbl0 as (
select ES.[session_id]
,ER.[blocking_session_id]
,ER.[request_id]
,ER.[start_time]
,ER.[status]
,ES.[status] as [status_session]
,ER.[command]
,ER.[percent_complete]
,DB_Name(coalesce(ER.[database_id], ES.[database_id])) as [DBName]
,(select top(1) [text] from sys.dm_exec_sql_text(ER.[sql_handle])) as [TSQL]
,(select top(1) [objectid] from sys.dm_exec_sql_text(ER.[sql_handle])) as [objectid]
,(select top(1) [query_plan] from sys.dm_exec_query_plan(ER.[plan_handle])) as [QueryPlan]
,ER.[wait_type]
,ES.[login_time]
,ES.[host_name]
,ES.[program_name]
,ER.[wait_time]
,ER.[last_wait_type]
,ER.[wait_resource]
,ER.[open_transaction_count]
,ER.[open_resultset_count]
,ER.[transaction_id]
,ER.[context_info]
,ER.[estimated_completion_time]
,ER.[cpu_time]
,ER.[total_elapsed_time]
,ER.[scheduler_id]
,ER.[task_address]
,ER.[reads]
,ER.[writes]
,ER.[logical_reads]
,ER.[text_size]
,ER.[language]
,ER.[date_format]
,ER.[date_first]
,ER.[quoted_identifier]
,ER.[arithabort]
,ER.[ansi_null_dflt_on]
,ER.[ansi_defaults]
,ER.[ansi_warnings]
,ER.[ansi_padding]
,ER.[ansi_nulls]
,ER.[concat_null_yields_null]
,ER.[transaction_isolation_level]
,ER.[lock_timeout]
,ER.[deadlock_priority]
,ER.[row_count]
,ER.[prev_error]
,ER.[nest_level]
,ER.[granted_query_memory]
,ER.[executing_managed_code]
,ER.[group_id]
,ER.[query_hash]
,ER.[query_plan_hash]
,EC.[most_recent_session_id]
,EC.[connect_time]
,EC.[net_transport]
,EC.[protocol_type]
,EC.[protocol_version]
,EC.[endpoint_id]
,EC.[encrypt_option]
,EC.[auth_scheme]
,EC.[node_affinity]
,EC.[num_reads]
,EC.[num_writes]
,EC.[last_read]
,EC.[last_write]
,EC.[net_packet_size]
,EC.[client_net_address]
,EC.[client_tcp_port]
,EC.[local_net_address]
,EC.[local_tcp_port]
,EC.[parent_connection_id]
,EC.[most_recent_sql_handle]
,ES.[host_process_id]
,ES.[client_version]
,ES.[client_interface_name]
,ES.[security_id]
,ES.[login_name]
,ES.[nt_domain]
,ES.[nt_user_name]
,ES.[memory_usage]
,ES.[total_scheduled_time]
,ES.[last_request_start_time]
,ES.[last_request_end_time]
,ES.[is_user_process]
,ES.[original_security_id]
,ES.[original_login_name]
,ES.[last_successful_logon]
,ES.[last_unsuccessful_logon]
,ES.[unsuccessful_logons]
,ES.[authenticating_database_id]
,ER.[sql_handle]
,ER.[statement_start_offset]
,ER.[statement_end_offset]
,ER.[plan_handle]
,ER.[dop]
,coalesce(ER.[database_id], ES.[database_id]) as [database_id]
,ER.[user_id]
,ER.[connection_id]
from sys.dm_exec_requests ER with(readuncommitted)
right join sys.dm_exec_sessions ES with(readuncommitted)
on ES.session_id = ER.session_id 
left join sys.dm_exec_connections EC  with(readuncommitted)
on EC.session_id = ES.session_id
)
, tbl as (
select [session_id]
,[blocking_session_id]
,[request_id]
,[start_time]
,[status]
,[status_session]
,[command]
,[percent_complete]
,[DBName]
,OBJECT_name([objectid], [database_id]) as [object]
,[TSQL]
,[QueryPlan]
,[wait_type]
,[login_time]
,[host_name]
,[program_name]
,[wait_time]
,[last_wait_type]
,[wait_resource]
,[open_transaction_count]
,[open_resultset_count]
,[transaction_id]
,[context_info]
,[estimated_completion_time]
,[cpu_time]
,[total_elapsed_time]
,[scheduler_id]
,[task_address]
,[reads]
,[writes]
,[logical_reads]
,[text_size]
,[language]
,[date_format]
,[date_first]
,[quoted_identifier]
,[arithabort]
,[ansi_null_dflt_on]
,[ansi_defaults]
,[ansi_warnings]
,[ansi_padding]
,[ansi_nulls]
,[concat_null_yields_null]
,[transaction_isolation_level]
,[lock_timeout]
,[deadlock_priority]
,[row_count]
,[prev_error]
,[nest_level]
,[granted_query_memory]
,[executing_managed_code]
,[group_id]
,[query_hash]
,[query_plan_hash]
,[most_recent_session_id]
,[connect_time]
,[net_transport]
,[protocol_type]
,[protocol_version]
,[endpoint_id]
,[encrypt_option]
,[auth_scheme]
,[node_affinity]
,[num_reads]
,[num_writes]
,[last_read]
,[last_write]
,[net_packet_size]
,[client_net_address]
,[client_tcp_port]
,[local_net_address]
,[local_tcp_port]
,[parent_connection_id]
,[most_recent_sql_handle]
,[host_process_id]
,[client_version]
,[client_interface_name]
,[security_id]
,[login_name]
,[nt_domain]
,[nt_user_name]
,[memory_usage]
,[total_scheduled_time]
,[last_request_start_time]
,[last_request_end_time]
,[is_user_process]
,[original_security_id]
,[original_login_name]
,[last_successful_logon]
,[last_unsuccessful_logon]
,[unsuccessful_logons]
,[authenticating_database_id]
,[sql_handle]
,[statement_start_offset]
,[statement_end_offset]
,[plan_handle]
,[dop]
,[database_id]
,[user_id]
,[connection_id]
from tbl0
where [status] in ('suspended', 'running', 'runnable')
)
, tbl_group as (
select [blocking_session_id]
from tbl
where [blocking_session_id]<>0
group by [blocking_session_id]
)
, tbl_res_rec as (
select [session_id]
,[blocking_session_id]
,[request_id]
,[start_time]
,[status]
,[status_session]
,[command]
,[percent_complete]
,[DBName]
,[object]
,[TSQL]
,[QueryPlan]
,[wait_type]
,[login_time]
,[host_name]
,[program_name]
,[wait_time]
,[last_wait_type]
,[wait_resource]
,[open_transaction_count]
,[open_resultset_count]
,[transaction_id]
,[context_info]
,[estimated_completion_time]
,[cpu_time]
,[total_elapsed_time]
,[scheduler_id]
,[task_address]
,[reads]
,[writes]
,[logical_reads]
,[text_size]
,[language]
,[date_format]
,[date_first]
,[quoted_identifier]
,[arithabort]
,[ansi_null_dflt_on]
,[ansi_defaults]
,[ansi_warnings]
,[ansi_padding]
,[ansi_nulls]
,[concat_null_yields_null]
,[transaction_isolation_level]
,[lock_timeout]
,[deadlock_priority]
,[row_count]
,[prev_error]
,[nest_level]
,[granted_query_memory]
,[executing_managed_code]
,[group_id]
,[query_hash]
,[query_plan_hash]
,[most_recent_session_id]
,[connect_time]
,[net_transport]
,[protocol_type]
,[protocol_version]
,[endpoint_id]
,[encrypt_option]
,[auth_scheme]
,[node_affinity]
,[num_reads]
,[num_writes]
,[last_read]
,[last_write]
,[net_packet_size]
,[client_net_address]
,[client_tcp_port]
,[local_net_address]
,[local_tcp_port]
,[parent_connection_id]
,[most_recent_sql_handle]
,[host_process_id]
,[client_version]
,[client_interface_name]
,[security_id]
,[login_name]
,[nt_domain]
,[nt_user_name]
,[memory_usage]
,[total_scheduled_time]
,[last_request_start_time]
,[last_request_end_time]
,[is_user_process]
,[original_security_id]
,[original_login_name]
,[last_successful_logon]
,[last_unsuccessful_logon]
,[unsuccessful_logons]
,[authenticating_database_id]
,[sql_handle]
,[statement_start_offset]
,[statement_end_offset]
,[plan_handle]
,[dop]
,[database_id]
,[user_id]
,[connection_id]
, 0 as [is_blocking_other_session]
from tbl
union all
select tbl0.[session_id]
,tbl0.[blocking_session_id]
,tbl0.[request_id]
,tbl0.[start_time]
,tbl0.[status]
,tbl0.[status_session]
,tbl0.[command]
,tbl0.[percent_complete]
,tbl0.[DBName]
,OBJECT_name(tbl0.[objectid], tbl0.[database_id]) as [object]
,tbl0.[TSQL]
,tbl0.[QueryPlan]
,tbl0.[wait_type]
,tbl0.[login_time]
,tbl0.[host_name]
,tbl0.[program_name]
,tbl0.[wait_time]
,tbl0.[last_wait_type]
,tbl0.[wait_resource]
,tbl0.[open_transaction_count]
,tbl0.[open_resultset_count]
,tbl0.[transaction_id]
,tbl0.[context_info]
,tbl0.[estimated_completion_time]
,tbl0.[cpu_time]
,tbl0.[total_elapsed_time]
,tbl0.[scheduler_id]
,tbl0.[task_address]
,tbl0.[reads]
,tbl0.[writes]
,tbl0.[logical_reads]
,tbl0.[text_size]
,tbl0.[language]
,tbl0.[date_format]
,tbl0.[date_first]
,tbl0.[quoted_identifier]
,tbl0.[arithabort]
,tbl0.[ansi_null_dflt_on]
,tbl0.[ansi_defaults]
,tbl0.[ansi_warnings]
,tbl0.[ansi_padding]
,tbl0.[ansi_nulls]
,tbl0.[concat_null_yields_null]
,tbl0.[transaction_isolation_level]
,tbl0.[lock_timeout]
,tbl0.[deadlock_priority]
,tbl0.[row_count]
,tbl0.[prev_error]
,tbl0.[nest_level]
,tbl0.[granted_query_memory]
,tbl0.[executing_managed_code]
,tbl0.[group_id]
,tbl0.[query_hash]
,tbl0.[query_plan_hash]
,tbl0.[most_recent_session_id]
,tbl0.[connect_time]
,tbl0.[net_transport]
,tbl0.[protocol_type]
,tbl0.[protocol_version]
,tbl0.[endpoint_id]
,tbl0.[encrypt_option]
,tbl0.[auth_scheme]
,tbl0.[node_affinity]
,tbl0.[num_reads]
,tbl0.[num_writes]
,tbl0.[last_read]
,tbl0.[last_write]
,tbl0.[net_packet_size]
,tbl0.[client_net_address]
,tbl0.[client_tcp_port]
,tbl0.[local_net_address]
,tbl0.[local_tcp_port]
,tbl0.[parent_connection_id]
,tbl0.[most_recent_sql_handle]
,tbl0.[host_process_id]
,tbl0.[client_version]
,tbl0.[client_interface_name]
,tbl0.[security_id]
,tbl0.[login_name]
,tbl0.[nt_domain]
,tbl0.[nt_user_name]
,tbl0.[memory_usage]
,tbl0.[total_scheduled_time]
,tbl0.[last_request_start_time]
,tbl0.[last_request_end_time]
,tbl0.[is_user_process]
,tbl0.[original_security_id]
,tbl0.[original_login_name]
,tbl0.[last_successful_logon]
,tbl0.[last_unsuccessful_logon]
,tbl0.[unsuccessful_logons]
,tbl0.[authenticating_database_id]
,tbl0.[sql_handle]
,tbl0.[statement_start_offset]
,tbl0.[statement_end_offset]
,tbl0.[plan_handle]
,tbl0.[dop]
,tbl0.[database_id]
,tbl0.[user_id]
,tbl0.[connection_id]
, 1 as [is_blocking_other_session]
from tbl_group as tg
inner join tbl0 on tg.blocking_session_id=tbl0.session_id
)
,tbl_res_rec_g as (
select [plan_handle],
[sql_handle],
cast([start_time] as date) as [start_time]
from tbl_res_rec
group by [plan_handle],
[sql_handle],
cast([start_time] as date)
)
,tbl_rec_stat_g as (
select qs.[plan_handle]
,qs.[sql_handle]
--,cast(qs.[last_execution_time] as date)	as [last_execution_time]
,min(qs.[creation_time])					as [creation_time]
,max(qs.[execution_count])				as [execution_count]
,max(qs.[total_worker_time])				as [total_worker_time]
,min(qs.[last_worker_time])				as [min_last_worker_time]
,max(qs.[last_worker_time])				as [max_last_worker_time]
,min(qs.[min_worker_time])				as [min_worker_time]
,max(qs.[max_worker_time])				as [max_worker_time]
,max(qs.[total_physical_reads])			as [total_physical_reads]
,min(qs.[last_physical_reads])			as [min_last_physical_reads]
,max(qs.[last_physical_reads])			as [max_last_physical_reads]
,min(qs.[min_physical_reads])				as [min_physical_reads]
,max(qs.[max_physical_reads])				as [max_physical_reads]
,max(qs.[total_logical_writes])			as [total_logical_writes]
,min(qs.[last_logical_writes])			as [min_last_logical_writes]
,max(qs.[last_logical_writes])			as [max_last_logical_writes]
,min(qs.[min_logical_writes])				as [min_logical_writes]
,max(qs.[max_logical_writes])				as [max_logical_writes]
,max(qs.[total_logical_reads])			as [total_logical_reads]
,min(qs.[last_logical_reads])				as [min_last_logical_reads]
,max(qs.[last_logical_reads])				as [max_last_logical_reads]
,min(qs.[min_logical_reads])				as [min_logical_reads]
,max(qs.[max_logical_reads])				as [max_logical_reads]
,max(qs.[total_clr_time])					as [total_clr_time]
,min(qs.[last_clr_time])					as [min_last_clr_time]
,max(qs.[last_clr_time])					as [max_last_clr_time]
,min(qs.[min_clr_time])					as [min_clr_time]
,max(qs.[max_clr_time])					as [max_clr_time]
,max(qs.[total_elapsed_time])				as [total_elapsed_time]
,min(qs.[last_elapsed_time])				as [min_last_elapsed_time]
,max(qs.[last_elapsed_time])				as [max_last_elapsed_time]
,min(qs.[min_elapsed_time])				as [min_elapsed_time]
,max(qs.[max_elapsed_time])				as [max_elapsed_time]
,max(qs.[total_rows])						as [total_rows]
,min(qs.[last_rows])						as [min_last_rows]
,max(qs.[last_rows])						as [max_last_rows]
,min(qs.[min_rows])						as [min_rows]
,max(qs.[max_rows])						as [max_rows]
,max(qs.[total_dop])						as [total_dop]
,min(qs.[last_dop])						as [min_last_dop]
,max(qs.[last_dop])						as [max_last_dop]
,min(qs.[min_dop])						as [min_dop]
,max(qs.[max_dop])						as [max_dop]
,max(qs.[total_grant_kb])					as [total_grant_kb]
,min(qs.[last_grant_kb])					as [min_last_grant_kb]
,max(qs.[last_grant_kb])					as [max_last_grant_kb]
,min(qs.[min_grant_kb])					as [min_grant_kb]
,max(qs.[max_grant_kb])					as [max_grant_kb]
,max(qs.[total_used_grant_kb])			as [total_used_grant_kb]
,min(qs.[last_used_grant_kb])				as [min_last_used_grant_kb]
,max(qs.[last_used_grant_kb])				as [max_last_used_grant_kb]
,min(qs.[min_used_grant_kb])				as [min_used_grant_kb]
,max(qs.[max_used_grant_kb])				as [max_used_grant_kb]
,max(qs.[total_ideal_grant_kb])			as [total_ideal_grant_kb]
,min(qs.[last_ideal_grant_kb])			as [min_last_ideal_grant_kb]
,max(qs.[last_ideal_grant_kb])			as [max_last_ideal_grant_kb]
,min(qs.[min_ideal_grant_kb])				as [min_ideal_grant_kb]
,max(qs.[max_ideal_grant_kb])				as [max_ideal_grant_kb]
,max(qs.[total_reserved_threads])			as [total_reserved_threads]
,min(qs.[last_reserved_threads])			as [min_last_reserved_threads]
,max(qs.[last_reserved_threads])			as [max_last_reserved_threads]
,min(qs.[min_reserved_threads])			as [min_reserved_threads]
,max(qs.[max_reserved_threads])			as [max_reserved_threads]
,max(qs.[total_used_threads])				as [total_used_threads]
,min(qs.[last_used_threads])				as [min_last_used_threads]
,max(qs.[last_used_threads])				as [max_last_used_threads]
,min(qs.[min_used_threads])				as [min_used_threads]
,max(qs.[max_used_threads])				as [max_used_threads]
from tbl_res_rec_g as t
inner join sys.dm_exec_query_stats as qs with(readuncommitted) on t.[plan_handle]=qs.[plan_handle] 
and t.[sql_handle]=qs.[sql_handle] 
and t.[start_time]=cast(qs.[last_execution_time] as date)
group by qs.[plan_handle]
,qs.[sql_handle]
--,qs.[last_execution_time]
)
select t.[session_id] --Сессия
,t.[blocking_session_id] --Сессия, которая явно блокирует сессию [session_id]
,t.[request_id] --Идентификатор запроса. Уникален в контексте сеанса
,t.[start_time] --Метка времени поступления запроса
,DateDiff(second, t.[start_time], GetDate()) as [date_diffSec] --Сколько в сек прошло времени от момента поступления запроса
,t.[status] --Состояние запроса
,t.[status_session] --Состояние сессии
,t.[command] --Тип выполняемой в данный момент команды
, COALESCE(
CAST(NULLIF(t.[total_elapsed_time] / 1000, 0) as BIGINT)
,CASE WHEN (t.[status_session] <> 'running' and isnull(t.[status], '')  <> 'running') 
THEN  DATEDIFF(ss,0,getdate() - nullif(t.[last_request_end_time], '1900-01-01T00:00:00.000'))
END
) as [total_time, sec] --Время всей работы запроса в сек
, CAST(NULLIF((CAST(t.[total_elapsed_time] as BIGINT) - CAST(t.[wait_time] AS BIGINT)) / 1000, 0 ) as bigint) as [work_time, sec] --Время работы запроса в сек без учета времени ожиданий
, CASE WHEN (t.[status_session] <> 'running' AND ISNULL(t.[status],'') <> 'running') 
THEN  DATEDIFF(ss,0,getdate() - nullif(t.[last_request_end_time], '1900-01-01T00:00:00.000'))
END as [sleep_time, sec] --Время сна в сек
, NULLIF( CAST((t.[logical_reads] + t.[writes]) * 8 / 1024 as numeric(38,2)), 0) as [IO, MB] --операций чтения и записи в МБ
, CASE  t.transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncommited'
WHEN 2 THEN 'ReadCommited'
WHEN 3 THEN 'Repetable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot'
END as [transaction_isolation_level_desc] --уровень изоляции транзакции (расшифровка)
,t.[percent_complete] --Процент завершения работы для следующих команд
,t.[DBName] --БД
,t.[object] --Объект
, SUBSTRING(
t.[TSQL]
, t.[statement_start_offset]/2+1
,	(
CASE WHEN ((t.[statement_start_offset]<0) OR (t.[statement_end_offset]<0))
THEN DATALENGTH (t.[TSQL])
ELSE t.[statement_end_offset]
END
- t.[statement_start_offset]
)/2 +1
) as [CURRENT_REQUEST] --Текущий выполняемый запрос в пакете
,t.[TSQL] --Запрос всего пакета
,t.[QueryPlan] --План всего пакета
,t.[wait_type] --Если запрос в настоящий момент блокирован, в столбце содержится тип ожидания (sys.dm_os_wait_stats)
,t.[login_time] --Время подключения сеанса
,t.[host_name] --Имя клиентской рабочей станции, указанное в сеансе. Для внутреннего сеанса это значение равно NULL
,t.[program_name] --Имя клиентской программы, которая инициировала сеанс. Для внутреннего сеанса это значение равно NULL
,cast(t.[wait_time]/1000 as decimal(18,3)) as [wait_timeSec] --Если запрос в настоящий момент блокирован, в столбце содержится продолжительность текущего ожидания (в секундах)
,t.[wait_time] --Если запрос в настоящий момент блокирован, в столбце содержится продолжительность текущего ожидания (в миллисекундах)
,t.[last_wait_type] --Если запрос был блокирован ранее, в столбце содержится тип последнего ожидания
,t.[wait_resource] --Если запрос в настоящий момент блокирован, в столбце указан ресурс, освобождения которого ожидает запрос
,t.[open_transaction_count] --Число транзакций, открытых для данного запроса
,t.[open_resultset_count] --Число результирующих наборов, открытых для данного запроса
,t.[transaction_id] --Идентификатор транзакции, в которой выполняется запрос
,t.[context_info] --Значение CONTEXT_INFO сеанса
,cast(t.[estimated_completion_time]/1000 as decimal(18,3)) as [estimated_completion_timeSec] --Только для внутреннего использования. Не допускает значение NULL
,t.[estimated_completion_time] --Только для внутреннего использования. Не допускает значение NULL
,cast(t.[cpu_time]/1000 as decimal(18,3)) as [cpu_timeSec] --Время ЦП (в секундах), затраченное на выполнение запроса
,t.[cpu_time] --Время ЦП (в миллисекундах), затраченное на выполнение запроса
,cast(t.[total_elapsed_time]/1000 as decimal(18,3)) as [total_elapsed_timeSec] --Общее время, истекшее с момента поступления запроса (в секундах)
,t.[total_elapsed_time] --Общее время, истекшее с момента поступления запроса (в миллисекундах)
,t.[scheduler_id] --Идентификатор планировщика, который планирует данный запрос
,t.[task_address] --Адрес блока памяти, выделенного для задачи, связанной с этим запросом
,t.[reads] --Число операций чтения, выполненных данным запросом
,t.[writes] --Число операций записи, выполненных данным запросом
,t.[logical_reads] --Число логических операций чтения, выполненных данным запросом
,t.[text_size] --Установка параметра TEXTSIZE для данного запроса
,t.[language] --Установка языка для данного запроса
,t.[date_format] --Установка параметра DATEFORMAT для данного запроса
,t.[date_first] --Установка параметра DATEFIRST для данного запроса
,t.[quoted_identifier] --1 = Параметр QUOTED_IDENTIFIER для запроса включен (ON). В противном случае — 0
,t.[arithabort] --1 = Параметр ARITHABORT для запроса включен (ON). В противном случае — 0
,t.[ansi_null_dflt_on] --1 = Параметр ANSI_NULL_DFLT_ON для запроса включен (ON). В противном случае — 0
,t.[ansi_defaults] --1 = Параметр ANSI_DEFAULTS для запроса включен (ON). В противном случае — 0
,t.[ansi_warnings] --1 = Параметр ANSI_WARNINGS для запроса включен (ON). В противном случае — 0
,t.[ansi_padding] --1 = Параметр ANSI_PADDING для запроса включен (ON)
,t.[ansi_nulls] --1 = Параметр ANSI_NULLS для запроса включен (ON). В противном случае — 0
,t.[concat_null_yields_null] --1 = Параметр CONCAT_NULL_YIELDS_NULL для запроса включен (ON). В противном случае — 0
,t.[transaction_isolation_level] --Уровень изоляции, с которым создана транзакция для данного запроса
,cast(t.[lock_timeout]/1000 as decimal(18,3)) as [lock_timeoutSec] --Время ожидания блокировки для данного запроса (в секундах)
,t.[lock_timeout] --Время ожидания блокировки для данного запроса (в миллисекундах)
,t.[deadlock_priority] --Значение параметра DEADLOCK_PRIORITY для данного запроса
,t.[row_count] --Число строк, возвращенных клиенту по данному запросу
,t.[prev_error] --Последняя ошибка, происшедшая при выполнении запроса
,t.[nest_level] --Текущий уровень вложенности кода, выполняемого для данного запроса
,t.[granted_query_memory] --Число страниц, выделенных для выполнения поступившего запроса (1 страница-это примерно 8 КБ)
,t.[executing_managed_code] --Указывает, выполняет ли данный запрос в настоящее время код объекта среды CLR (например, процедуры, типа или триггера).
--Этот флаг установлен в течение всего времени, когда объект среды CLR находится в стеке, даже когда из среды вызывается код Transact-SQL
,t.[group_id]	--Идентификатор группы рабочей нагрузки, которой принадлежит этот запрос
,t.[query_hash] --Двоичное хэш-значение рассчитывается для запроса и используется для идентификации запросов с аналогичной логикой.
--Можно использовать хэш запроса для определения использования статистических ресурсов для запросов, которые отличаются только своими литеральными значениями
,t.[query_plan_hash] --Двоичное хэш-значение рассчитывается для плана выполнения запроса и используется для идентификации аналогичных планов выполнения запросов.
--Можно использовать хэш плана запроса для нахождения совокупной стоимости запросов со схожими планами выполнения
,t.[most_recent_session_id] --Представляет собой идентификатор сеанса самого последнего запроса, связанного с данным соединением
,t.[connect_time] --Отметка времени установления соединения
,t.[net_transport] --Содержит описание физического транспортного протокола, используемого данным соединением
,t.[protocol_type] --Указывает тип протокола передачи полезных данных
,t.[protocol_version] --Версия протокола доступа к данным, связанного с данным соединением
,t.[endpoint_id] --Идентификатор, описывающий тип соединения. Этот идентификатор endpoint_id может использоваться для запросов к представлению sys.endpoints
,t.[encrypt_option] --Логическое значение, указывающее, разрешено ли шифрование для данного соединения
,t.[auth_scheme] --Указывает схему проверки подлинности (SQL Server или Windows), используемую с данным соединением
,t.[node_affinity] --Идентифицирует узел памяти, которому соответствует данное соединение
,t.[num_reads] --Число пакетов, принятых посредством данного соединения
,t.[num_writes] --Число пакетов, переданных посредством данного соединения
,t.[last_read] --Отметка времени о последнем полученном пакете данных
,t.[last_write] --Отметка времени о последнем отправленном пакете данных
,t.[net_packet_size] --Размер сетевого пакета, используемый для передачи данных
,t.[client_net_address] --Сетевой адрес удаленного клиента
,t.[client_tcp_port] --Номер порта на клиентском компьютере, который используется при осуществлении соединения
,t.[local_net_address] --IP-адрес сервера, с которым установлено данное соединение. Доступен только для соединений, которые в качестве транспорта данных используют протокол TCP
,t.[local_tcp_port] --TCP-порт сервера, если соединение использует протокол TCP
,t.[parent_connection_id] --Идентифицирует первичное соединение, используемое в сеансе MARS
,t.[most_recent_sql_handle] --Дескриптор последнего запроса SQL, выполненного с помощью данного соединения. Постоянно проводится синхронизация между столбцом most_recent_sql_handle и столбцом most_recent_session_id
,t.[host_process_id] --Идентификатор процесса клиентской программы, которая инициировала сеанс. Для внутреннего сеанса это значение равно NULL
,t.[client_version] --Версия TDS-протокола интерфейса, который используется клиентом для подключения к серверу. Для внутреннего сеанса это значение равно NULL
,t.[client_interface_name] --Имя библиотеки или драйвер, используемый клиентом для обмена данными с сервером. Для внутреннего сеанса это значение равно NULL
,t.[security_id] --Идентификатор безопасности Microsoft Windows, связанный с именем входа
,t.[login_name] --SQL Server Имя входа, под которой выполняется текущий сеанс.
--Чтобы узнать первоначальное имя входа, с помощью которого был создан сеанс, см. параметр original_login_name.
--Может быть SQL Server проверка подлинности имени входа или имени пользователя домена, прошедшего проверку подлинности Windows
,t.[nt_domain] --Домен Windows для клиента, если во время сеанса применяется проверка подлинности Windows или доверительное соединение.
--Для внутренних сеансов и пользователей, не принадлежащих к домену, это значение равно NULL
,t.[nt_user_name] --Имя пользователя Windows для клиента, если во время сеанса используется проверка подлинности Windows или доверительное соединение.
--Для внутренних сеансов и пользователей, не принадлежащих к домену, это значение равно NULL
,t.[memory_usage] --Количество 8-килобайтовых страниц памяти, используемых данным сеансом
,t.[total_scheduled_time] --Общее время, назначенное данному сеансу (включая его вложенные запросы) для исполнения, в миллисекундах
,t.[last_request_start_time] --Время, когда начался последний запрос данного сеанса. Это может быть запрос, выполняющийся в данный момент
,t.[last_request_end_time] --Время завершения последнего запроса в рамках данного сеанса
,t.[is_user_process] --0, если сеанс является системным. В противном случае значение равно 1
,t.[original_security_id] --Microsoft Идентификатор безопасности Windows, связанный с параметром original_login_name
,t.[original_login_name] --SQL Server Имя входа, которую использует клиент создал данный сеанс.
--Это может быть имя входа SQL Server, прошедшее проверку подлинности, имя пользователя домена Windows, 
--прошедшее проверку подлинности, или пользователь автономной базы данных.
--Обратите внимание, что после первоначального соединения для сеанса может быть выполнено много неявных или явных переключений контекста.
--Например если EXECUTE AS используется
,t.[last_successful_logon] --Время последнего успешного входа в систему для имени original_login_name до запуска текущего сеанса
,t.[last_unsuccessful_logon] --Время последнего неуспешного входа в систему для имени original_login_name до запуска текущего сеанса
,t.[unsuccessful_logons] --Число неуспешных попыток входа в систему для имени original_login_name между временем last_successful_logon и временем login_time
,t.[authenticating_database_id] --Идентификатор базы данных, выполняющей проверку подлинности участника.
--Для имен входа это значение будет равно 0.
--Для пользователей автономной базы данных это значение будет содержать идентификатор автономной базы данных
,t.[sql_handle] --Хэш-карта текста SQL-запроса
,t.[statement_start_offset] --Количество символов в выполняемом в настоящий момент пакете или хранимой процедуре, в которой запущена текущая инструкция.
--Может применяться вместе с функциями динамического управления sql_handle, statement_end_offset и sys.dm_exec_sql_text
--для извлечения исполняемой в настоящий момент инструкции по запросу
,t.[statement_end_offset] --Количество символов в выполняемом в настоящий момент пакете или хранимой процедуре, в которой завершилась текущая инструкция.
--Может применяться вместе с функциями динамического управления sql_handle, statement_end_offset и sys.dm_exec_sql_text
--для извлечения исполняемой в настоящий момент инструкции по запросу
,t.[plan_handle] --Хэш-карта плана выполнения SQL
,t.[database_id] --Идентификатор базы данных, к которой выполняется запрос
,t.[user_id] --Идентификатор пользователя, отправившего данный запрос
,t.[connection_id] --Идентификатор соединения, по которому поступил запрос
,t.[is_blocking_other_session] --1-сессия явно блокирует другие сессии, 0-сессия явно не блокирует другие сессии
,coalesce(t.[dop], mg.[dop]) as [dop] --Степень параллелизма запроса
,mg.[request_time] --Дата и время обращения запроса за предоставлением памяти
,mg.[grant_time] --Дата и время, когда запросу была предоставлена память. Возвращает значение NULL, если память еще не была предоставлена
,mg.[requested_memory_kb] --Общий объем запрошенной памяти в килобайтах
,mg.[granted_memory_kb] --Общий объем фактически предоставленной памяти в килобайтах.
--Может быть значение NULL, если память еще не была предоставлена.
--Обычно это значение должно быть одинаковым с requested_memory_kb.
--Для создания индекса сервер может разрешить дополнительное предоставление по требованию памяти,
--объем которой выходит за рамки изначально предоставленной памяти
,mg.[required_memory_kb] --Минимальный объем памяти в килобайтах (КБ), необходимый для выполнения данного запроса.
--Значение requested_memory_kb равно этому объему или больше его
,mg.[used_memory_kb] --Используемый в данный момент объем физической памяти (в килобайтах)
,mg.[max_used_memory_kb] --Максимальный объем используемой до данного момента физической памяти в килобайтах
,mg.[query_cost] --Ожидаемая стоимость запроса
,mg.[timeout_sec] --Время ожидания данного запроса в секундах до отказа от обращения за предоставлением памяти
,mg.[resource_semaphore_id] --Неуникальный идентификатор семафора ресурса, которого ожидает данный запрос
,mg.[queue_id] --Идентификатор ожидающей очереди, в которой данный запрос ожидает предоставления памяти.
--Значение NULL, если память уже предоставлена
,mg.[wait_order] --Последовательный порядок ожидающих запросов в указанной очереди queue_id.
--Это значение может изменяться для заданного запроса, если другие запросы отказываются от предоставления памяти или получают ее.
--Значение NULL, если память уже предоставлена
,mg.[is_next_candidate] --Является следующим кандидатом на предоставление памяти (1 = да, 0 = нет, NULL = память уже предоставлена)
,mg.[wait_time_ms] --Время ожидания в миллисекундах. Значение NULL, если память уже предоставлена
,mg.[pool_id] --Идентификатор пула ресурсов, к которому принадлежит данная группа рабочей нагрузки
,mg.[is_small] --Значение 1 означает, что для данной операции предоставления памяти используется малый семафор ресурса.
--Значение 0 означает использование обычного семафора
,mg.[ideal_memory_kb] --Объем, в килобайтах (КБ), предоставленной памяти, необходимый для размещения всех данных в физической памяти.
--Основывается на оценке количества элементов
,mg.[reserved_worker_count] --Число рабочих процессов, зарезервированной с помощью параллельных запросов, а также число основных рабочих процессов, используемых всеми запросами
,mg.[used_worker_count] --Число рабочих процессов, используемых параллельных запросов
,mg.[max_used_worker_count] --???
,mg.[reserved_node_bitmap] --???
,pl.[bucketid] --Идентификатор сегмента хэша, в который кэшируется запись.
--Значение указывает диапазон от 0 до значения размера хэш-таблицы для типа кэша.
--Для кэшей SQL Plans и Object Plans размер хэш-таблицы может достигать 10007 на 32-разрядных версиях систем и 40009 — на 64-разрядных.
--Для кэша Bound Trees размер хэш-таблицы может достигать 1009 на 32-разрядных версиях систем и 4001 на 64-разрядных.
--Для кэша расширенных хранимых процедур размер хэш-таблицы может достигать 127 на 32-разрядных и 64-разрядных версиях систем
,pl.[refcounts] --Число объектов кэша, ссылающихся на данный объект кэша.
--Значение refcounts для записи должно быть не меньше 1, чтобы размещаться в кэше
,pl.[usecounts] --Количество повторений поиска объекта кэша.
--Остается без увеличения, если параметризованные запросы обнаруживают план в кэше.
--Может быть увеличен несколько раз при использовании инструкции showplan
,pl.[size_in_bytes] --Число байтов, занимаемых объектом кэша
,pl.[memory_object_address] --Адрес памяти кэшированной записи.
--Это значение можно использовать с представлением sys.dm_os_memory_objects,
--чтобы проанализировать распределение памяти кэшированного плана, 
--и с представлением sys.dm_os_memory_cache_entries для определения затрат на кэширование записи
,pl.[cacheobjtype] --Тип объекта в кэше. Значение может быть одним из следующих
,pl.[objtype] --Тип объекта. Значение может быть одним из следующих
,pl.[parent_plan_handle] --Родительский план
--данные из sys.dm_exec_query_stats брались за сутки, в которых была пара (запрос, план)
,qs.[creation_time] --Время компиляции плана
,qs.[execution_count] --Количество выполнений плана с момента последней компиляции
,qs.[total_worker_time] --Общее время ЦП, затраченное на выполнение плана с момента компиляции, в микросекундах (но с точностью до миллисекунды)
,qs.[min_last_worker_time] --Минимальное время ЦП, затраченное на последнее выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[max_last_worker_time] --Максимальное время ЦП, затраченное на последнее выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[min_worker_time] --Минимальное время ЦП, когда-либо затраченное на выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[max_worker_time] --Максимальное время ЦП, когда-либо затраченное на выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[total_physical_reads] --Общее количество операций физического считывания при выполнении плана с момента его компиляции.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[min_last_physical_reads] --Минимальное количество операций физического считывания за время последнего выполнения плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[max_last_physical_reads] --Максимальное количество операций физического считывания за время последнего выполнения плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[min_physical_reads] --Минимальное количество операций физического считывания за одно выполнение плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[max_physical_reads] --Максимальное количество операций физического считывания за одно выполнение плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[total_logical_writes] --Общее количество операций логической записи при выполнении плана с момента его компиляции.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[min_last_logical_writes] --Минимальное количество страниц в буферном пуле, загрязненных во время последнего выполнения плана.
--Если страница уже является «грязной» (т. е. измененной), операции записи не учитываются.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[max_last_logical_writes] --Максимальное количество страниц в буферном пуле, загрязненных во время последнего выполнения плана.
--Если страница уже является «грязной» (т. е. измененной), операции записи не учитываются.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[min_logical_writes] --Минимальное количество операций логической записи за одно выполнение плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[max_logical_writes] --Максимальное количество операций логической записи за одно выполнение плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[total_logical_reads] --Общее количество операций логического считывания при выполнении плана с момента его компиляции.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[min_last_logical_reads] --Минимальное количество операций логического считывания за время последнего выполнения плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[max_last_logical_reads] --Максимальное количество операций логического считывания за время последнего выполнения плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[min_logical_reads]	   --Минимальное количество операций логического считывания за одно выполнение плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[max_logical_reads]	--Максимальное количество операций логического считывания за одно выполнение плана.
--Значение всегда равно 0 при запросе оптимизированной для памяти таблицы
,qs.[total_clr_time]	--Время, в микросекундах (но с точностью до миллисекунды),
--внутри Microsoft .NET Framework общеязыковая среда выполнения (CLR) объекты при выполнении плана с момента его компиляции.
--Объекты среды CLR могут быть хранимыми процедурами, функциями, триггерами, типами и статистическими выражениями
,qs.[min_last_clr_time] --Минимальное время, в микросекундах (но с точностью до миллисекунды),
--затраченное внутри .NET Framework объекты среды CLR во время последнего выполнения плана.
--Объекты среды CLR могут быть хранимыми процедурами, функциями, триггерами, типами и статистическими выражениями
,qs.[max_last_clr_time] --Максимальное время, в микросекундах (но с точностью до миллисекунды),
--затраченное внутри .NET Framework объекты среды CLR во время последнего выполнения плана.
--Объекты среды CLR могут быть хранимыми процедурами, функциями, триггерами, типами и статистическими выражениями
,qs.[min_clr_time] --Минимальное время, когда-либо затраченное на выполнение плана внутри объектов .NET Framework среды CLR,
--в микросекундах (но с точностью до миллисекунды).
--Объекты среды CLR могут быть хранимыми процедурами, функциями, триггерами, типами и статистическими выражениями
,qs.[max_clr_time] --Максимальное время, когда-либо затраченное на выполнение плана внутри среды CLR .NET Framework,
--в микросекундах (но с точностью до миллисекунды).
--Объекты среды CLR могут быть хранимыми процедурами, функциями, триггерами, типами и статистическими выражениями
--,qs.[total_elapsed_time] --Общее время, затраченное на выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[min_last_elapsed_time] --Минимальное время, затраченное на последнее выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[max_last_elapsed_time] --Максимальное время, затраченное на последнее выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[min_elapsed_time] --Минимальное время, когда-либо затраченное на выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[max_elapsed_time] --Максимальное время, когда-либо затраченное на выполнение плана, в микросекундах (но с точностью до миллисекунды)
,qs.[total_rows] --Общее число строк, возвращаемых запросом. Не может иметь значение null.
--Значение всегда равно 0, если скомпилированная в собственном коде хранимая процедура запрашивает оптимизированную для памяти таблицу
,qs.[min_last_rows] --Минимальное число строк, возвращенных последним выполнением запроса. Не может иметь значение null.
--Значение всегда равно 0, если скомпилированная в собственном коде хранимая процедура запрашивает оптимизированную для памяти таблицу
,qs.[max_last_rows] --Максимальное число строк, возвращенных последним выполнением запроса. Не может иметь значение null.
--Значение всегда равно 0, если скомпилированная в собственном коде хранимая процедура запрашивает оптимизированную для памяти таблицу
,qs.[min_rows] --Минимальное количество строк, когда-либо возвращенных по запросу во время выполнения один
--Значение всегда равно 0, если скомпилированная в собственном коде хранимая процедура запрашивает оптимизированную для памяти таблицу
,qs.[max_rows] --Максимальное число строк, когда-либо возвращенных по запросу во время выполнения один
--Значение всегда равно 0, если скомпилированная в собственном коде хранимая процедура запрашивает оптимизированную для памяти таблицу
,qs.[total_dop] --Общую сумму по степени параллелизма плана используется с момента его компиляции.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_last_dop] --Минимальная степень параллелизма, если время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_last_dop] --Максимальная степень параллелизма, если время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_dop] --Минимальная степень параллелизма этот план когда-либо используется во время одного выполнения.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_dop] --Максимальная степень параллелизма этот план когда-либо используется во время одного выполнения.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[total_grant_kb] --Общий объем зарезервированной памяти в КБ предоставить этот план, полученных с момента его компиляции.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_last_grant_kb] --Минимальный объем зарезервированной памяти предоставляет в КБ, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_last_grant_kb] --Максимальный объем зарезервированной памяти предоставляет в КБ, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_grant_kb] --Минимальный объем зарезервированной памяти в КБ предоставить никогда не получено в ходе одного выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_grant_kb] --Максимальный объем зарезервированной памяти в КБ предоставить никогда не получено в ходе одного выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[total_used_grant_kb] --Общий объем зарезервированной памяти в КБ предоставить этот план, используемый с момента его компиляции.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_last_used_grant_kb] --Минимальная сумма предоставления используемой памяти в КБ, если время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_last_used_grant_kb] --Максимальная сумма предоставления используемой памяти в КБ, если время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_used_grant_kb] --Минимальный объем используемой памяти в КБ предоставить никогда не используется при выполнении одного плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_used_grant_kb] --Максимальный объем используемой памяти в КБ предоставить никогда не используется при выполнении одного плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[total_ideal_grant_kb] --Общий объем идеальный память в КБ, оценка плана с момента его компиляции.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_last_ideal_grant_kb] --Минимальный объем памяти, идеальным предоставляет в КБ, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_last_ideal_grant_kb] --Максимальный объем памяти, идеальным предоставляет в КБ, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_ideal_grant_kb] --Минимальный объем памяти идеальный предоставления в этот план когда-либо оценка во время выполнения один КБ.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_ideal_grant_kb] --Максимальный объем памяти идеальный предоставления в этот план когда-либо оценка во время выполнения один КБ.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[total_reserved_threads] --Общая сумма по зарезервированным параллельного потоков этот план когда-либо использовавшегося с момента его компиляции.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_last_reserved_threads] --Минимальное число зарезервированных параллельных потоков, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_last_reserved_threads] --Максимальное число зарезервированных параллельных потоков, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_reserved_threads] --Минимальное число зарезервированных параллельного потоков, когда-либо использовать при выполнении одного плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_reserved_threads] --Максимальное число зарезервированных параллельного потоков никогда не используется при выполнении одного плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[total_used_threads] --Общая сумма используется параллельных потоков этот план когда-либо использовавшегося с момента его компиляции.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_last_used_threads] --Минимальное число используемых параллельных потоков, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_last_used_threads] --Максимальное число используемых параллельных потоков, когда время последнего выполнения плана.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[min_used_threads] --Минимальное число используемых параллельных потоков, при выполнении одного плана использовали.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
,qs.[max_used_threads] --Максимальное число используемых параллельных потоков, при выполнении одного плана использовали.
--Он всегда будет равно 0 для запроса к таблице, оптимизированной для памяти
from tbl_res_rec as t
left outer join sys.dm_exec_query_memory_grants as mg on t.[plan_handle]=mg.[plan_handle] and t.[sql_handle]=mg.[sql_handle]
left outer join sys.dm_exec_cached_plans as pl on t.[plan_handle]=pl.[plan_handle]
left outer join tbl_rec_stat_g as qs on t.[plan_handle]=qs.[plan_handle] and t.[sql_handle]=qs.[sql_handle] --and qs.[last_execution_time]=cast(t.[start_time] as date);

میں آپ کو یہ بھی یاد دلاتا ہوں کہ جمع کیے گئے اعدادوشمار کے مطابق آپ سب سے مشکل سوالات حاصل کر سکتے ہیں:
کوڈ

/*
creation_time - Время, когда запрос был скомпилирован. Поскольку при старте сервера кэш пустой, данное время всегда больше либо равно моменту запуска сервиса. Если время, указанное в этом столбце позже, чем предполагаемое (первое использование процедуры), это говорит о том, что запрос по тем или иным причинам был рекомпилирован.
last_execution_time - Момент фактического последнего выполнения запроса.
execution_count - Сколько раз запрос был выполнен с момента компиляции
Количество выполнений позволяет найти ошибки в алгоритмах - часто в наиболее выполняемых запросах оказываются те, которые находятся внутри каких-либо циклов однако могут быть выполнены перед самим циклом один раз. Например, получение каких-либо параметров из базы данных, не меняющихся внутри цикла.
CPU - Суммарное время использования процессора в миллисекундах. Если запрос обрабатывается параллельно, то это время может превысить общее время выполнения запроса, поскольку суммируется время использования запроса каждым ядром. Во время использования процессора включается только фактическая нагрузка на ядра, в нее не входят ожидания каких-либо ресурсов.
Очевидно, что данный показатель позволяет выявлять запросы, наиболее сильно загружающие процессор.
AvgCPUTime - Средняя загрузка процессора на один запрос. 
TotDuration - Общее время выполнения запроса, в миллисекундах.
Данный параметр может быть использован для поиска тех запросов, которые, независимо от причины выполняются "наиболее долго". Если общее время выполнения запроса существенно ниже времени CPU (с поправкой на параллелизм) - это говорит о том, что при выполнения запроса были ожидания каких-либо ресурсов. В большинстве случаев это связано с дисковой активностью или блокировками, но также это может быть сетевой интерфейс или другой ресурс. 
Полный список типов ожиданий можно посмотреть в описании представления sys.dm_os_wait_stats.
AvgDur - Среднее время выполнения запроса в миллисекундах.
Reads - Общее количество чтений.
Это пожалуй лучший агрегатный показатель, позволяющий выявить наиболее нагружающие сервер запросы.
Логическое чтение - это разовое обращение к странице данных, физические чтения не учитываются.
В рамках выполнения одного запроса, могут происходить неоднократные обращения к одной и той же странице.
Чем больше обращений к страницам, тем больше требуется дисковых чтений, памяти и, если речь идет о повторных обращениях, большее время требуется удерживать страницы в памяти.
Writes - Общее количество изменений страниц данных.
Характеризует то, как запрос "нагружает" дисковую систему операциями записи.
Следует помнить, что этот показатель может быть больше 0 не только у тех запросов, которые явно меняют данные, но также и у тех, которые сохраняют промежуточные данные в tempdb.
AggIO - Общее количество логических операций ввода-вывода (суммарно)
Как правило, количество логических чтений на порядки превышает количество операций записи, поэтому этот показатель сам по себе для анализа применим в редких случаях.
AvgIO - Среднее количество логических дисковых операций на одно выполнение запроса.
Значение данного показателя можно анализировать из следующих соображений:
Одна страница данных - это 8192 байта. Можно получить среднее количество байт данных, "обрабатываемых" данным запросом. Если этот объем превышает реальное количество данных, которые обрабатывает запрос (суммарный объем данных в используемых в запросе таблицах), это говорит о том, что был выбран заведомо плохой план выполнения и требуется заняться оптимизацией данного запроса.
Я встречал случай, когда один запрос делал количество обращений, эквивалентных объему в 5Тб, при этом общий объем данных в это БД был 300Гб, а объем данных в таблицах, задействованных в запросе не превышал 10Гб.
В общем можно описать одну причину такого поведения сервера - вместо использования индекса сервер предпочитает сканировать таблицу или наоборот.
Если объем логических чтений в разы превосходит общие объем данных, то это вызвано повторным обращениям к одним и тем же страницам данных. Помимо того, что в одном запросе таблица может быть использована несколько раз, к одним и тем же страницам сервер обращается например в случаях, когда используется индекс и по результатам поиска по нему, найденные некоторые строки данных лежат на одной и той же странице. Конечно, в таком случае предпочтительным могло бы быть сканирование таблицы - в этом случае сервер обращался бы к каждой странице данных только один раз. Однако этому часто мешают... попытки оптимизации запросов, когда разработчик явно указывает, какой индекс или тип соединения должен быть использован.
Обратный случай - вместо использования индекса было выбрано сканирование таблицы. Как правило, это связано с тем, что статистика устарела и требуется её обновление. Однако и в этом случае причиной неудачно выбранного плана вполне могут оказаться подсказки оптимизатору запросов.
query_text - Текст самого запроса
database_name - Имя базы данных, в находится объект, содержащий запрос. NULL для системных процедур
object_name - Имя объекта (процедуры или функции), содержащего запрос.
*/
with s as (
select  creation_time,
last_execution_time,
execution_count,
total_worker_time/1000 as CPU,
convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
qs.total_elapsed_time/1000 as TotDuration,
convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
total_logical_reads as [Reads],
total_logical_writes as [Writes],
total_logical_reads+total_logical_writes as [AggIO],
convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
[sql_handle],
plan_handle,
statement_start_offset,
statement_end_offset
from sys.dm_exec_query_stats as qs with(readuncommitted)
where convert(money, (qs.total_elapsed_time))/(execution_count*1000)>=100 --выполнялся запрос не менее 100 мс
)
select
s.creation_time,
s.last_execution_time,
s.execution_count,
s.CPU,
s.[AvgCPUTime],
s.TotDuration,
s.[AvgDur],
s.[Reads],
s.[Writes],
s.[AggIO],
s.[AvgIO],
--st.text as query_text,
case 
when sql_handle IS NULL then ' '
else(substring(st.text,(s.statement_start_offset+2)/2,(
case
when s.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2      
else s.statement_end_offset    
end - s.statement_start_offset)/2  ))
end as query_text,
db_name(st.dbid) as database_name,
object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as [object_name],
sp.[query_plan],
s.[sql_handle],
s.plan_handle
from s
cross apply sys.dm_exec_sql_text(s.[sql_handle]) as st
cross apply sys.dm_exec_query_plan(s.[plan_handle]) as sp

آپ MySQL کے لیے بھی لکھ سکتے ہیں۔ ایسا کرنے کے لیے آپ کو انسٹال کرنا ہوگا۔ mysql-connector-net اور پھر اس طرح کوڈ لکھیں:
زیر التواء درخواستوں کا کوڈ

#Задаем переменные для подключение к MySQL и само подключение
[string]$sMySQLUserName = 'UserName'
[string]$sMySQLPW = 'UserPassword'
[string]$sMySQLDB = 'db'
[string]$sMySQLHost = 'IP-address'
[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data");
[string]$sConnectionString = "server="+$sMySQLHost+";port=3306;uid=" + $sMySQLUserName + ";pwd="+"'" + $sMySQLPW +"'"+ ";database="+$sMySQLDB;
#Open a Database connection
$oConnection = New-Object MySql.Data.MySqlClient.MySqlConnection($sConnectionString)
$Error.Clear()
try
{
$oConnection.Open()
}
catch
{
write-warning ("Could not open a connection to Database $sMySQLDB on Host $sMySQLHost. Error: "+$Error[0].ToString())
}
#The first query
# Get an instance of all objects need for a SELECT query. The Command object
$oMYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand;
# DataAdapter Object
$oMYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter;
# And the DataSet Object
$oMYSQLDataSet = New-Object System.Data.DataSet;
# Assign the established MySQL connection
$oMYSQLCommand.Connection=$oConnection;
# Define a SELECT query
$oMYSQLCommand.CommandText='query';
$oMYSQLDataAdapter.SelectCommand=$oMYSQLCommand;
# Execute the query
$count=$oMYSQLDataAdapter.Fill($oMYSQLDataSet, "data");
$result = $oMYSQLDataSet.Tables[0].Rows[0]["Count"];
write-host $result;

نتیجہ

اس مضمون نے Zabbix میں پرفارمنس کاؤنٹرز (ڈیٹا آئٹمز) کی ایک مثال کو دیکھا۔ یہ نقطہ نظر منتظمین کو حقیقی وقت میں یا کچھ مخصوص وقت کے بعد مختلف مسائل کے بارے میں مطلع کرنے کی اجازت دیتا ہے۔ اس طرح، یہ نقطہ نظر ہمیں مستقبل میں ایک اہم مسئلہ کی موجودگی کو کم سے کم کرنے اور DBMS اور سرور کے آپریشن کو روکنے کی اجازت دیتا ہے، جس کے نتیجے میں پیداوار کو کام کے عمل کو روکنے سے بچاتا ہے۔
پچھلا مضمون: MS SQL سرور میں انفارمیشن سسٹم ڈیٹا بیس 24×7 کے ساتھ معمول کا کام

ذرائع کے مطابق:

» Zabbix 3.4
» کارکردگی کاؤنٹر
» Azure SQL ڈیٹا بیس اور SQL سرور ڈیٹا بیس انجن کے لیے کارکردگی کا مرکز
» ایس کیو ایل طرز زندگی
» SQLSkills
» ٹیک نیٹ مائیکروسافٹ
» میموری کے استعمال کا تجزیہ
» کارکردگی کا تجزیہ
» ایس کیو ایل دستاویزات
» ونڈوز کے بارے میں نوٹس

ماخذ: www.habr.com

نیا تبصرہ شامل کریں