MS SQL سرور ڊيٽابيس کي مانيٽر ڪرڻ لاء زيبڪس استعمال ڪندي

اڳوڻي

اڪثر وقت ۾ ڊيٽابيس (ڊيٽابيس) سان لاڳاپيل مسئلن بابت منتظم کي آگاهي ڏيڻ جي ضرورت آهي.

هي آرٽيڪل بيان ڪندو ته MS SQL سرور ڊيٽابيس کي مانيٽر ڪرڻ لاءِ Zabbix ۾ ڇا ترتيب ڏيڻ جي ضرورت آهي.

مان توهان جي توجه هن حقيقت ڏانهن ڇڪايان ٿو ته تفصيل سان ترتيب ڏيڻ ڪيئن نه ڏني ويندي، جڏهن ته، فارمولن ۽ عام سفارشون، گڏو گڏ هڪ تفصيلي تفصيل سان گڏ ڪيل ڊيٽا عناصر کي ذخيرو ٿيل طريقيڪار ذريعي شامل ڪرڻ جو تفصيلي بيان هن آرٽيڪل ۾ ڏنو ويندو.
انهي سان گڏ، صرف مکيه ڪارڪردگي شمارن کي هتي سمجهيو ويندو.

فيصلو

پهرين، آئون انهن سڀني ڪارڪردگي جي ڳڻپيندڙن کي بيان ڪندس (زبڪس ۾ شيون ذريعي) جيڪي اسان کي گهرجن:

  1. منطقي ڊسڪ
    1. اوسط ڊسڪ سيڪنڊ/پڙهو
      ڊسڪ مان ڊيٽا پڙهڻ لاء سيڪنڊن ۾ اوسط وقت ڏيکاري ٿو. سراسري ڪارڪردگي جي انسداد جو سراسري قدر. ڊسڪ سيڪنڊ/پڙهڻ لازمي نه هجڻ گهرجي 10 ملي سيڪنڊن کان. سراسري ڪارڪردگي انسداد جي وڌ ۾ وڌ قيمت. ڊسڪ سيڪنڊ/پڙهڻ نه گهرجي 50 مليسيڪنڊ کان وڌيڪ.

      زيبڪس: perf_counter[LogicalDisk(_Total)Avg. Disk sec/Read]، ۽ اهو پڻ ضروري آهي ته گهربل ڊسڪ جي ٽريڪ رکو، مثال طور: perf_counter[LogicalDisk(C:)Avg. ڊسڪ سيڪنڊ/پڙهو]

      ٽرگر جا مثال:
      {NOTE_NAME:perf_counter[LogicalDisk(_Total)Avg. ڊسڪ سيڪنڊ/پڙھ].last()}>0.005، ليول-هاءِ
      и
      {NOTE_NAME:perf_counter[LogicalDisk(_Total)Avg. ڊسڪ سيڪنڊ/پڙھو].last()}>0.0025، ليول-ميڊيم

    2. اوسط ڊسڪ سيڪنڊ/لکيو
      ڊسڪ تي ڊيٽا لکڻ لاءِ سيڪنڊن ۾ سراسري وقت ڏيکاري ٿو. سراسري ڪارڪردگي جي انسداد جو سراسري قدر. ڊسڪ سيڪنڊ/لکڻ 10 ملي سيڪنڊن کان وڌيڪ نه هجڻ گهرجي. سراسري ڪارڪردگي انسداد جي وڌ ۾ وڌ قيمت. ڊسڪ سيڪنڊ/لکڻ 50 ملي سيڪنڊن کان وڌيڪ نه هجڻ گهرجي.

      زيبڪس: perf_counter[LogicalDisk(_Total)Avg. ڊسڪ سيڪنڊ/لکيو]، ۽ اهو پڻ ضروري آهي ته گهربل ڊسڪ جي ٽريڪ رکڻ لاء، مثال طور: perf_counter[LogicalDisk(C:)Avg. ڊسڪ سيڪنڊ/لکيو]

      ٽرگر جا مثال:
      {NOTE_NAME:perf_counter[LogicalDisk(_Total)Avg. ڊسڪ سيڪنڊ/لکيو].آخري()}>0.005، ليول-هاءِ
      и
      {NOTE_NAME:perf_counter[LogicalDisk(_Total)Avg. ڊسڪ سيڪنڊ/لکيو].last()}>0.0025، ليول-ميڊيم

    3. سراسري ڊسڪ قطار جي ڊگھائي

      ڊسڪ ڏانهن درخواست جي قطار جي سراسري ڊيگهه. مخصوص وقت جي وقفي دوران التوا واري ڊسڪ درخواستن جو تعداد ڏيکاري ٿو. عام قطار ھڪڙي ڊسڪ لاء 2 کان وڌيڪ نه آھي. جيڪڏهن قطار ۾ ٻه کان وڌيڪ درخواستون آهن، ته ڊسڪ شايد اوورلوڊ ٿيل آهي ۽ ايندڙ درخواستن تي عمل ڪرڻ جو وقت نه آهي. توھان استعمال ڪري سگھوٿا Avg ڳڻپيندڙن کي اھو معلوم ڪرڻ لاءِ ته ڪھڙي عملن کي ڊسڪ سنڀالي نٿي سگھي. ڊسڪ پڙهڻ واري قطار جي ڊيگهه (درخواست جي قطار پڙهڻ) ۽ اوسط. ڊسڪ رائٽ قطار جي ڊيگهه (لکھڻ جي درخواست جي قطار).
      سراسري قدر. ڊسڪ جي قطار جي ڊگھائي ماپ نه ڪئي وئي آهي، پر حساب ڪتاب جي رياضياتي نظريي کان ننڍي جي قانون مطابق. هن قانون جي مطابق، پروسيس ٿيڻ جي انتظار ۾ درخواستن جو تعداد، سراسري طور تي، موصول ٿيل درخواستن جي تعدد جي برابر آهي، درخواست جي پروسيسنگ وقت سان ضرب ڪيو ويو آهي. اهي. اسان جي صورت ۾ Avg. ڊسڪ قطار جي ڊيگهه = (ڊسڪ جي منتقلي/سيڪنڊ) * (ايس ڊي ڊسڪ سيڪنڊ/منتقلي).

      آگسٽ ڊسڪ جي قطار جي ڊيگهه ڏني وئي آهي مکيه ڳڻپيندڙن مان هڪ ڊسڪ سب سسٽم جي ڪم جي لوڊ کي طئي ڪرڻ لاء، جڏهن ته، ان کي مناسب انداز ۾ اندازو ڪرڻ لاء، اهو ضروري آهي ته صحيح طور تي اسٽوريج سسٽم جي جسماني ساخت جي نمائندگي ڪرڻ لاء. مثال طور، هڪ هارڊ ڊسڪ لاءِ، 2 کان وڏي قيمت کي نازڪ سمجهيو ويندو آهي، ۽ جيڪڏهن ڊسڪ 4 ڊسڪ جي RAID صف تي واقع آهي، ته پوءِ توهان کي پريشان ٿيڻ گهرجي ته قيمت 4 * 2 = 8 کان وڌيڪ آهي.

      زيبڪس: perf_counter[LogicalDisk(_Total)Avg. ڊسڪ قطار جي ڊگھائي]، ۽ اهو پڻ ضروري آهي ته گهربل ڊسڪ جي ٽريڪ رکڻ لاء، مثال طور: perf_counter[LogicalDisk(C:)Avg. ڊسڪ قطار جي ڊگھائي]

  2. هوندي آهي
    1. صفحا/ سيڪنڊ
      انهن صفحن جو تعداد ڏيکاري ٿو جيڪي SQL سرور ڊسڪ مان پڙهيا آهن يا ميموري صفحن تائين رسائي کي حل ڪرڻ لاءِ ڊسڪ تي لکيا آهن جيڪي رسائي جي وقت مين ياداشت ۾ لوڊ نه ڪيا ويا هئا. هي قدر صفحن جي انپٽ/سيڪنڊ ۽ صفحن جي آئوٽ پُٽ/سيڪنڊ ويلز جو مجموعو آهي، ۽ ايپليڪيشن ڊيٽا فائلن تائين رسائي حاصل ڪرڻ لاءِ سسٽم ڪيش جي پيجنگ (سواپنگ/سواپنگ) کي به حساب ۾ رکي ٿو. ان ۾ غير محفوظ ٿيل سڌي طرح ميموري ميپ ٿيل فائلن جي پيجنگ پڻ شامل آهي. اهو ڏسڻ لاءِ مکيه ڪائونٽر آهي جيڪڏهن توهان تجربو ڪري رهيا آهيو اعلي ياداشت جي استعمال ۽ لاڳاپيل اضافي پيجنگ. هي انسداد ادل بدلڻ جي مقدار کي بيان ڪري ٿو ۽ ان جي عام (چوٽي نه) قيمت صفر جي ويجهو هجڻ گهرجي. ادل ۾ اضافو RAM وڌائڻ يا سرور تي هلندڙ ايپليڪيشنن جو تعداد گهٽائڻ جي ضرورت کي ظاهر ڪري ٿو.

      زيبڪس: perf_counter[MemoryPages/sec] ٽرگر جو مثال:
      {NOTE_NAME:perf_counter[MemoryPages/sec].min(5m)}>1000، سطح جي ڄاڻ

    2. صفحي جي غلطي/سيڪنڊ

      ھي آھي پيج فالٽ ڪاؤنٽر جو قدر. ھڪڙي صفحي جي غلطي ٿيندي آھي جڏھن ھڪڙو عمل ھڪڙو ورچوئل ميموري صفحي جو حوالو ڏئي ٿو جيڪو ڪم ڪندڙ RAM ۾ نه آھي. هي ڪائونٽر انهن ٻنهي پيج جي غلطين تي غور ڪري ٿو جن کي ڊسڪ جي رسائي جي ضرورت آهي ۽ اهي صفحو رام ۾ ڪم ڪندڙ سيٽ کان ٻاهر هجڻ جي ڪري. گھڻا پروسيسر ھٿ ڪري سگھندا آھن ٽائپ XNUMX پيج جي غلطين کي بغير دير جي. بهرحال، ٽائپ XNUMX صفحي جي غلطين کي سنڀالڻ، جنهن کي ڊسڪ رسائي جي ضرورت هوندي آهي، اهم دير ٿي سگهي ٿي.

      زيبڪس: perf_counter[MemoryPage Faults/sec] ٽرگر جو مثال:
      {NODE_NAME:perf_counter[MemoryPage Faults/sec].min(5m)}>1000، سطح جي ڄاڻ

    3. دستياب بائيٽ

      مختلف عملن کي هلائڻ لاءِ موجود بائٽس ۾ ميموري جي مقدار جو ٽريڪ رکي ٿو. گھٽ تعداد جو مطلب آھي گھٽ ياداشت. حل آهي ياداشت کي وڌائڻ. هي ميٽر اڪثر ڪيسن ۾ مسلسل 5000 kV کان مٿي هجڻ گهرجي.
      هيٺ ڏنل سببن جي ڪري دستياب Mbytes لاءِ حد مقرر ڪرڻ سمجھ ۾ اچي ٿو:

      • 50٪ مفت ياداشت دستياب = بهترين
      • 25٪ دستياب ياداشت = ڌيان جي ضرورت آهي
      • 10٪ مفت = ممڪن مسئلا
      • 5٪ دستياب ياداشت کان گهٽ = رفتار لاءِ نازڪ، توهان کي مداخلت ڪرڻ جي ضرورت آهي.
      زيبڪس: perf_counter[MemoryAvailable Bytes]

  3. پروسيسر (ڪل): ٪ پروسيسر وقت
    هي ڪائونٽر وقت جو سيڪڙو ڏيکاري ٿو ته پروسيسر غير آئيڊيل ٿريڊز (غير آئيڊيل ٿريڊ) لاءِ آپريشنز تي عمل ڪرڻ ۾ مصروف هو. هي قدر مفيد ڪم انجام ڏيڻ لاءِ گهربل وقت جو هڪ حصو سمجهي سگهجي ٿو. هر پروسيسر کي هڪ بيڪار سلسلي سان لڳايو وڃي ٿو جيڪو غير پيداواري پروسيسر سائيڪلن کي استعمال ڪري ٿو جيڪو ٻين موضوعن طرفان استعمال نه ڪيو ويو آهي. هي انسداد مختصر چوٽي جي خاصيت آهي جيڪا 100 سيڪڙو تائين پهچي سگهي ٿي. بهرحال، جيڪڏهن وڌايل مدي وارا آهن جڏهن پروسيسر استعمال 80 سيڪڙو کان مٿي آهي، پوء سسٽم وڌيڪ موثر ٿيندو جڏهن وڌيڪ پروسيسر استعمال ڪندي.

    زيبڪس: perf_counter[Processor(_Total)% پروسيسر ٽائيم]، هتي اهو پڻ ڏيکاري سگهجي ٿو ڪور طرفان
    ٽرگر جو مثال:
    {NODE_NAME:perf_counter[Processor(_Total)% پروسيسر ٽائيم].min(5m)}>80، سطح جي ڄاڻ

  4. نيٽ ورڪ انٽرفيس (*): % Bytes Total/sec
    سڀني انٽرفيس تي في سيڪنڊ موڪليل ۽ وصول ڪيل بائيٽ جو ڪل تعداد. هي انٽرفيس بينڊوڊٿ آهي (بائيٽس ۾). اهو ضروري آهي ته هن انسداد جي قيمت نيٽ ورڪ ڪارڊ جي وڌ ۾ وڌ بينڊوڊٿ سان مقابلو ڪرڻ لاء. عام طور تي، هن انسداد کي 50٪ نيٽ ورڪ اڊاپٽر بينڊوڊٿ استعمال کان وڌيڪ نه ڏيکارڻ گهرجي.
    زيبڪس: perf_counter[نيٽ ورڪ انٽرفيس(*)Bytes Sent/sec]
  5. MS SQL سرور: رسائي جا طريقا
    SQL Server ۾ Access Methods اعتراض هڪ ڊيٽابيس اندر منطقي ڊيٽا تائين رسائي کي ٽريڪ ڪرڻ ۾ مدد لاءِ ڪائونٽر مهيا ڪري ٿو. ڊسڪ تي ڊيٽابيس صفحن تائين جسماني رسائي بفر مئنيجر ڳڻپيندڙن جي ذريعي ڪنٽرول ڪئي وئي آهي. ڊيٽابيس ۾ ڊيٽا جي رسائي جي طريقن جو مشاهدو توهان کي اهو طئي ڪرڻ ۾ مدد ڪري ٿو ته ڇا توهان انڊيڪسز کي شامل ڪرڻ يا تبديل ڪرڻ، پارٽيشنز کي شامل ڪرڻ يا منتقل ڪرڻ، فائلن يا فائلن جا گروپ شامل ڪرڻ، انڊيڪسز کي خراب ڪرڻ، يا سوال جي متن کي تبديل ڪندي سوال جي ڪارڪردگي کي بهتر بڻائي سگهو ٿا. توھان پڻ استعمال ڪري سگھو ٿا ڳڻپيندڙن کي رسائي طريقن جي اعتراض تي ڊيٽا جي سائيز جي نگراني ڪرڻ لاءِ، انڊيڪسس، ۽ ڊيٽابيس ۾ خالي جاءِ، ڪنٽرولنگ حجم ۽ هر سرور مثال لاءِ ٽڪراءُ. گھڻي انڊيڪس جي ڀڃڪڙي ڪارڪردگي کي خاص طور تي خراب ڪري سگھي ٿو.

    1. صفحو ورهايو/سيڪنڊ
      صفحي جي وقفن جو تعداد في سيڪنڊ جيڪو انڊيڪس صفحي جي اوور فلوز جي نتيجي ۾ ٿيو. هن ميٽرڪ لاءِ هڪ اعليٰ قدر جو مطلب آهي ته ڊيٽا داخل ڪرڻ ۽ تازه ڪاري ڪرڻ وقت، SQL سرور کي صفحن کي ورهائڻ ۽ موجوده صفحي جو حصو نئين جڳه تي منتقل ڪرڻ لاءِ وڏي تعداد ۾ وسيلن سان لاڳاپيل عملن کي انجام ڏيڻو پوندو. اهڙين عملن کان پاسو ڪيو وڃي جڏهن ممڪن هجي. توھان ٻن طريقن سان مسئلو حل ڪرڻ جي ڪوشش ڪري سگھو ٿا:
      - خودڪار واڌ واري ڪالمن تي ڪلستر ٿيل انڊيڪس ٺاھيو. ان صورت ۾، نيون داخلائون اڳ ۾ ئي ڊيٽا تي قبضو ڪيل صفحن جي اندر نه رکيا ويندا، پر ترتيب سان نون صفحن تي قبضو ڪندا؛
      - Fillfactor پيٽرولر جي قيمت کي وڌائڻ سان انڊيڪس کي ٻيهر ٺاھيو. هي اختيار انڊيڪس صفحن ۾ خالي جاءِ کي اجازت ڏئي ٿو نئين ڊيٽا لاءِ محفوظ ڪيو وڃي بغير صفحي جي ضرورت جي.
      زيبڪس: perf_counter["MSSQL$InstanceName:Access 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. مڪمل اسڪين/سيڪنڊ
      لامحدود مڪمل اسڪين جو تعداد في سيڪنڊ. انهن عملن ۾ بيس ٽيبل اسڪين ۽ مڪمل انڊيڪس اسڪين شامل آهن. هن اشاري ۾ هڪ مستحڪم اضافو ٿي سگهي ٿو سسٽم جي تباهي (ضروري انڊيڪس جي گهٽتائي، انهن جي مضبوط ٽڪرا، اصلاح ڪندڙ طرفان موجوده انڊيڪس جو غير استعمال، غير استعمال ٿيل انڊيڪس جي موجودگي). بهرحال، اها ڳالهه نوٽ ڪرڻ جي قابل آهي ته ننڍڙي ٽيبل تي مڪمل اسڪين هميشه خراب ناهي، ڇاڪاڻ ته جيڪڏهن توهان سڄي ٽيبل کي رام ۾ فٽ ڪري سگهو ٿا، پوء اهو مڪمل اسڪين ڪرڻ لاء تيز ٿي ويندو. پر اڪثر ڪيسن ۾، هن انسداد جي هڪ مستحڪم ترقي نظام جي تباهي کي ظاهر ڪندو. هي سڀ صرف OLTP سسٽم تي لاڳو ٿئي ٿو. OLAP سسٽم ۾، مسلسل مڪمل اسڪين عام آهن.
      زيبڪس: perf_counter["MSSQL$InstanceName:Access MethodsFull Scans/sec",30]

  6. MS SQL سرور: بفر مئنيجر
    بفر مئنيجر اعتراض ڪائونٽر مهيا ڪري ٿو مانيٽر ڪرڻ لاءِ ته SQL سرور ڪيئن استعمال ڪري رهيو آهي هيٺين وسيلن:
    - ڊيٽا صفحن کي محفوظ ڪرڻ لاء ياداشت؛
    - ڪائونٽر فزيڪل I/O مانيٽر ڪرڻ لاءِ استعمال ٿيندا هئا جڏهن SQL سرور ڊيٽابيس صفحن کي پڙهي ۽ لکندو آهي؛
    - بفر پول جي توسيع ڪرڻ لاءِ بفر ڪيش کي وڌائڻ لاءِ تيز غير مستحڪم ميموري استعمال ڪندي، جهڙوڪ سولڊ اسٽيٽ ڊرائيو (SSD)؛
    - SQL سرور پاران استعمال ڪيل ميموري ۽ ڪائونٽر جي نگراني ھيٺ ڏنل معلومات حاصل ڪرڻ ۾ مدد ڪري ٿي؛
    - ڇا جسماني ياداشت جي گھٽتائي جي ڪري ڪا به "روڪون" آهن. جيڪڏهن بار بار رسائي ٿيل ڊيٽا ڪيش نه ٿي سگهي، SQL سرور ان کي ڊسڪ مان پڙهڻ لاء مجبور ڪيو ويندو آهي؛
    - ڇا ميموري جي مقدار کي وڌائڻ يا ڊيٽا کي ڪيش ڪرڻ يا SQL سرور جي اندروني اڏاوتن کي محفوظ ڪرڻ لاءِ اضافي ميموري مختص ڪرڻ سان سوالن جي عمل جي ڪارڪردگي کي وڌائڻ ممڪن آهي؛
    ڪيترا ڀيرا SQL سرور ڊسڪ مان ڊيٽا پڙهي ٿو. ٻين عملن جي مقابلي ۾، جهڙوڪ ياداشت جي رسائي، جسماني I/O گهڻي وقت وٺندو آهي. I/O کي گهٽائڻ سان سوال جي ڪارڪردگي بهتر ٿي سگھي ٿي.

    1. بفر ڪيش مارا ريڊيو
      ظاهر ڪري ٿو ته ڪيئن مڪمل طور تي SQL سرور ڪيش بفر ۾ ڊيٽا مختص ڪري سگهي ٿو. هي قدر اعلي، بهتر. SQL سرور لاءِ موثر طريقي سان ڊيٽا صفحن تائين رسائي حاصل ڪرڻ لاءِ، اھي لازمي طور تي ڪيش بفر ۾ ھجن ۽ اتي ڪو به جسماني ان پٽ/آئوٽ پُٽ (I/O) آپريشن نه ھجڻ گھرجي. جيڪڏهن هن انسداد جي اوسط قيمت ۾ مسلسل گهٽتائي آهي، توهان کي رام شامل ڪرڻ تي غور ڪرڻ گهرجي. هي اشارو هميشه OLTP سسٽم لاءِ 90٪ کان مٿي ۽ OLAP سسٽم لاءِ 50٪ کان مٿي هجڻ گهرجي.
      زيبڪس: perf_counter["MSSQL$INSTANCE_NAME:بفر مئنيجر بفر ڪيش هٽ ريشو"،30] ٽرگر جا مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:Buffer ManagerBuffer cache hit ratio",30].last()}<70, level-high
      и
      {NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:Buffer ManagerBuffer cache hit ratio",30].last()}<80, level-medium
    2. صفحي جي زندگي جي توقع
      ظاهر ڪري ٿو ته صفحو ڪيترو وقت تائين مستقل طور تي پنهنجي موجوده حالت ۾ ياداشت ۾ رهندو. جيڪڏهن قيمت گهٽجي رهي آهي، ان جو مطلب اهو آهي ته سسٽم بفر پول کي استعمال ڪري رهيو آهي. ان ڪري، ميموري آپريشن ممڪن طور تي مسئلا پيدا ڪري سگهي ٿي ڪارڪردگي جي خرابي جي ڪري. اها ڳالهه نوٽ ڪرڻ جي قابل آهي ته هيٺ ڪو به عالمگير اشارو نه آهي جنهن جي هيٺان اهو واضح طور تي فيصلو ڪري سگهجي ٿو ته سسٽم بفر پول کي غلط استعمال ڪري رهيو آهي (300 سيڪنڊن جو اشارو MS SQL Server 2012 سان ختم ٿيل آهي).
      زيبڪس: perf_counter["MSSQL$INSTENTION_NAME:Buffer ManagerPage life expectancy"30] ٽرگر جو مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:Buffer ManagerPage life expectancy"30].last()}<5، سطح جي ڄاڻ

  7. MS SQL سرور: جنرل شماريات
    SQL سرور ۾ جنرل شماريات جو اعتراض ڳڻپيوڪر مهيا ڪري ٿو جيڪي توھان کي سرور جي مجموعي سرگرمي جي نگراني ڪرڻ جي اجازت ڏين ٿا، جھڙوڪ سمورو ڪنيڪشن جو تعداد ۽ استعمال ڪندڙن جو تعداد في سيڪنڊ سان ڳنڍڻ يا ڊس ڪنيڪشن ڪندڙ ڪمپيوٽر کان SQL سرور جو مثال ھلندڙ. اهي ميٽرڪس وڏي آن لائين ٽرانزيڪشن پروسيسنگ (OLTP) سسٽم ۾ ڪارائتو آهن جتي ڪلائنٽ جو هڪ وڏو تعداد SQL سرور مثال کان مسلسل ڳنڍي ۽ ختم ڪري رهيا آهن.

    1. عمل بند ٿيل
      ھن وقت بند ٿيل عملن جو تعداد.
      زيبڪس: perf_counter["MSSQL$INSPECTION_NAME:عام شماريات جا عمل بند ٿيل"،30] ٽرگر جو مثال: ({NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:General StatisticsProcesses blocked",30].min(2m,0)}>=0)
      ۽ ({NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:General StatisticsProcesses blocked",30].time(0)}>=50000)
      ۽ ({NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:General StatisticsProcesses blocked",30].time(0)}<=230000)، سطح جي ڄاڻ (هتي 05:00 کان 23:00 تائين الارم پابندي آهي)
    2. استعمال ڪندڙ ڪنيڪشن
      استعمال ڪندڙن جو تعداد ھن وقت SQL سرور سان ڳنڍيل آھي.
      زيبڪس: perf_counter["MSSQL$INSPECTION_NAME:General StatisticsUser Connections" 30]

  8. MS SQL سرور: لاڪ
    Microsoft SQL Server ۾ Locks اعتراض انفرادي وسيلن جي قسمن تي حاصل ڪيل SQL سرور لاڪ بابت معلومات مهيا ڪري ٿو. لاڪ جاري ڪيا ويا آهن SQL سرور وسيلن تي، جيئن قطارون پڙهيل يا ٽرانزيڪشن طرفان تبديل ٿيل، ڪيترن ئي ٽرانزيڪشن کي هڪ ئي وقت ۾ وسيلن کي استعمال ڪرڻ کان روڪڻ لاءِ. مثال طور، جيڪڏهن هڪ خاص (X) تالا حاصل ڪيو ويو آهي ٽرانزيڪشن ذريعي هڪ ٽيبل ۾ قطار تي، ٻيو ڪوبه ٽرانزيڪشن ان قطار کي تبديل نٿو ڪري سگهي جيستائين تالا جاري نه ٿئي. تالون جي استعمال کي گھٽائڻ سان هم آهنگي وڌي ٿي، جيڪا مجموعي ڪارڪردگي کي بهتر بڻائي سگھي ٿي. Locks اعتراض جا ڪيترائي مثال هڪ ئي وقت ٽريڪ ڪري سگهجن ٿا، جن مان هر هڪ مختلف قسم جي وسيلن تي تالا جي نمائندگي ڪندو.

    1. سراسري انتظار جو وقت (ms)
      سراسري انتظار جو وقت (ملي سيڪنڊن ۾) سڀني تالا جي درخواستن لاءِ جنهن لاءِ انتظار جي ضرورت آهي. هي ڪائونٽر صارف جي عملن جي اوسط تعداد کي ماپ ڪري ٿو جيڪو وسيلن تي تالا حاصل ڪرڻ لاءِ قطار ۾ بيهڻو آهي. هن ڪائونٽر جي وڌ ۾ وڌ قابل اجازت قيمت مڪمل طور تي توهان جي ڪم تي منحصر آهي، هتي سڀني ايپليڪيشنن لاء اوسط قيمت مقرر ڪرڻ ڏکيو آهي. جيڪڏھن ھي ڪائونٽر تمام گھڻو آھي، اھو ٿي سگھي ٿو توھان جي ڊيٽابيس ۾ لاڪ سان مسئلا.
      زيبڪس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)اوسط انتظار جو وقت (ms)",30] ٽرگر جو مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_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. لاڪ ٽائم آئوٽ/ سيڪنڊ
      ٻيهر ڪوششن جو تعداد جڏهن راؤنڊ-رابن ذريعي تالا حاصل نه ٿي ڪري سگھجي. SQL سرور جي اسپن ڪاؤنٽر جي ترتيب واري پيٽرولر جو قدر ٿريڊ (اسپنز) جي "ٽرن" جو تعداد مقرر ڪري ٿو ان کان اڳ جو وقت ختم ٿئي ۽ ٿريڊ بيڪار ٿي وڃي.
      زيبڪس: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Timeouts/sec",30] ٽرگر جو مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_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$INSPECTION_NAME:Locks(_Total)Lock Requests/sec",30].last()}>500000, info-level
    6. بندن جو تعداد / سيڪنڊ
      في سيڪنڊ تالا جي درخواستن جو تعداد جنهن جي نتيجي ۾ هڪ تعطل ۾. Deadlocks ظاھر ڪن ٿا خراب سوالن جا جيڪي حصيداري وسيلن کي بلاڪ ڪن ٿا.
      زيبڪس: perf_counter["MSSQL$INSTENTION_NAME: Deadlocks/sec جو تعداد" 30] ٽرگر جو مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:Locks(_Total)Deadlocks/sec"30].last()}>1، سطح-هاءِ

  9. MS SQL سرور: ميموري مئنيجر
    Microsoft SQL Server ۾ ميموري مئنيجر اعتراض سرور جي وسيع ميموري استعمال جي نگراني ڪرڻ لاءِ ڪائونٽر مهيا ڪري ٿو. صارف جي سرگرمي ۽ وسيلن جي استعمال جو جائزو وٺڻ لاءِ سرور جي وسيع ميموري استعمال جي نگراني ڪارڪردگي جي رڪاوٽ کي سڃاڻڻ ۾ مدد ڪري سگھي ٿي. SQL سرور جي مثال جي ذريعي استعمال ڪيل ميموري ڪنٽرول کي طئي ڪرڻ ۾ مدد ڪري سگھي ٿي:
    - ڇا ڪيش ۾ بار بار رسائي ڪيل ڊيٽا کي ذخيرو ڪرڻ لاء ڪافي جسماني ياداشت ۾ گهٽتائي آهي. جيڪڏهن ڪافي ياداشت نه آهي، SQL سرور کي ڊسڪ مان ڊيٽا ٻيهر حاصل ڪرڻ گهرجي.
    - ڇا سوال جي ڪارڪردگي بهتر ٿي سگهي ٿي جيڪڏهن وڌيڪ ميموري شامل ڪئي وڃي يا وڌيڪ ميموري موجود آهي ڊيٽا کي ڪيش ڪرڻ لاءِ يا SQL سرور اندروني جوڙجڪ.

    1. ميموري گرانٽس شاندار
      عملن جو ڪل تعداد بيان ڪري ٿو جن ڪاميابيءَ سان ڪم اسپيس ميموري حاصل ڪئي آھي. اشاري ۾ هڪ مستحڪم ڦوٽو سان، ان کي رام وڌائڻ ضروري آهي.
      زيبڪس: perf_counter["MSSQL$INSTENTION_NAME:ميموري مئنيجر ميموري گرانٽس بقايا"،30]
    2. ميموري گرانٽس التوا ۾
      ڪم ڪندڙ ميموري جي انتظار ۾ عملن جي ڪل تعداد کي ڏنو وڃي ٿو. اشاري جي هڪ مستحڪم ترقي سان، ان کي رام وڌائڻ ضروري آهي.
      زيبڪس: perf_counter["MSSQL$InstanceName:Memory ManagerMemory Grants Pending",30]

  10. MS SQL سرور: شماريات
    Microsoft SQL Server ۾ شماريات جو اعتراض ڳڻپيوڪر مهيا ڪري ٿو تاليف ۽ سوالن جي قسمن کي مانيٽر ڪرڻ لاءِ SQL سرور جي هڪ مثال ڏانهن موڪليو ويو. سوالن جي تاليفن ۽ ٻيهر ٺاھڻ جي تعداد جي نگراني ڪرڻ ۽ SQL سرور جي ھڪڙي مثال سان مليل بيچ جو تعداد توھان کي اھو خيال ڏئي ٿو ته SQL سرور ڪيتري جلدي صارف جي سوالن تي عمل ڪري رھيو آھي ۽ ڪھڙيءَ طرح موثر طريقي سان پڇا ڳاڇا ڪرڻ وارو انھن تي عمل ڪري ٿو.

    1. بيچ درخواستون / سيڪنڊ
      Transact-SQL ڪمانڊ پيڪٽس جو تعداد في سيڪنڊ وصول ڪيو. اهي انگ اکر ڪنهن به حد کان متاثر ٿين ٿا (I/O، استعمال ڪندڙن جو تعداد، ڪيش سائيز، سوال جي پيچيدگي، وغيره). پيڪٽ جي درخواستن جو هڪ وڏو تعداد اشارو ڪري ٿو اعلي throughput.
      زيبڪس: perf_counter["MSSQL$InstanceName: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) ۽ پي ايس 2 (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_EXECUTED_QUERY،powershell -NoProfile -ExecutionPolicy Bypass -FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_EXECUTED_QUERY.ps1
UserParameter=PARAMETER_NAME_NUMBER_of_PENDING_REQUESTS،powershell -NoProfile -ExecutionPolicy Bypass -FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_PENDING_REQUESTS.ps1
ان کان پوء، اسان .conf فائل کي بچايو ۽ Zabbix ايجنٽ کي ٻيهر شروع ڪريو.
ان کان پوء، اسان زيبڪس ۾ ٻه نوان عنصر شامل ڪندا آهيون (هن صورت ۾، نالا ۽ ڪنجي ساڳيا آهن):
NAME_PARAMETER_NUMBER_PERFORMED_QUERY
NAME_PARAMETER_NUMBER_PENDING_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 ۾ ڪارڪردگي ڳڻپيندڙن (شيون) جو هڪ مثال ڍڪيو آهي. اهو طريقو توهان کي اجازت ڏئي ٿو منتظمين کي مختلف مسئلن بابت حقيقي وقت ۾ يا ڪجهه وقت کان پوءِ. ان ڪري، هي طريقو مستقبل ۾ هڪ نازڪ مسئلي جي واقعن کي گهٽائڻ ۽ ڊي بي ايم ايس ۽ سرور جي آپريشن کي روڪڻ جي اجازت ڏئي ٿو، جنهن جي نتيجي ۾ پيداوار کي ڪم جي عمل کي روڪڻ کان بچائيندو آهي.
اڳيون مضمون: MS SQL سرور ۾ معلوماتي سسٽم ڊيٽابيس 24×7 سان معمولي ڪم

ذريعن:

» زيبڪس 3.4
» ڪارڪردگي شماريندڙ
» Azure SQL ڊيٽابيس ۽ SQL سرور ڊيٽابيس انجڻ لاءِ ڪارڪردگي سينٽر
» SQL طرز زندگي
» SQLSkills
» Microsoft TechNet
» ياداشت جي استعمال جو تجزيو
» ڪارڪردگي جو تجزيو
» SQL دستاويز
» ونڊوز نوٽس

جو ذريعو: www.habr.com

تبصرو شامل ڪريو