د MS SQL سرور ډیټابیس نظارت کولو لپاره د زیبکس کارول

وړاندیز

ډیری وختونه په ریښتیني وخت کې د ډیټابیس (ډیټابیس) پورې اړوند ستونزو په اړه مدیر ته خبر ورکول اړین دي.

دا مقاله به تشریح کړي چې په زبکس کې د MS SQL سرور ډیټابیس نظارت کولو لپاره څه تنظیم کولو ته اړتیا لري.

زه ستاسو پام دې حقیقت ته را اړوم چې په تفصیل سره به د تنظیم کولو څرنګوالی نه ورکول کیږي، په هرصورت، فورمولونه او عمومي سپارښتنې، په بیله بیا د ذخیره شوي پروسیجرونو له لارې د دودیز ډیټا عناصرو اضافه کولو تفصيلي توضیحات به پدې مقاله کې ورکړل شي.
همچنان ، یوازې د اصلي فعالیت شمیرونکي به دلته په پام کې ونیول شي.

پریکړه

لومړی، زه به ټول هغه د فعالیت شمیرونکي تشریح کړم (په زبیکس کې د توکو له لارې) چې موږ ورته اړتیا لرو:

  1. منطقي ډیسک
    1. اوسط ډیسک ثانی/لوستل
      د ډیسک څخه د معلوماتو لوستلو لپاره په ثانیو کې اوسط وخت ښیې. د اوسط فعالیت کاونټر اوسط ارزښت. د ډیسک ثانیه/لوستل باید د 10 ملی ثانیو څخه ډیر نه وي. د اوسط فعالیت کاونټر اعظمي ارزښت. د ډیسک ثانیه / لوستل باید له 50 ملی ثانیو څخه ډیر نه وي.

      زبیبکس: perf_counter[LogicalDisk(_Total)Avg. Disk sec/Read]، او دا هم مهمه ده چې د مطلوب ډیسک تعقیب وساتئ، د بیلګې په توګه: perf_counter[LogicalDisk(C:)Avg. ډیسک ثانیه/لوستل]

      د محرک مثالونه:
      {NODE_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. Disk sec/write]، او دا هم مهمه ده چې د مطلوب ډیسک تعقیب وساتئ، د بیلګې په توګه: 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، کچه منځنی

    3. د اوسط ډیسک قطار اوږدوالی

      ډیسک ته د غوښتنې کتار اوسط اوږدوالی. د ټاکل شوي وخت وقفې په جریان کې د پاتې ډیسک غوښتنو شمیر ښیې. نورمال قطار د یو واحد ډیسک لپاره له 2 څخه ډیر نه دی. که چیرې په قطار کې له دوه څخه ډیر غوښتنې شتون ولري ، نو ډیسک شاید ډیر بار شوی وي او د راتلونکو غوښتنو پروسس کولو لپاره وخت نلري. تاسو کولی شئ د اوسط کاونټرونو څخه کار واخلئ ترڅو معلومه کړئ چې کوم عملیات ډیسک نشي کولی. د ډیسک لوستلو قطار اوږدوالی (د غوښتنې کتار لوستل) او اوسط. د ډیسک رایټ قطار اوږدوالی (د غوښتنې کتار لیکل).
      اوسط ارزښت د ډیسک قطار اوږدوالی نه اندازه کیږي، مګر د قطارونو ریاضیاتي تیوري څخه د کوچني قانون سره سم محاسبه کیږي. د دې قانون له مخې، د غوښتنلیکونو شمیر چې پروسس کولو ته انتظار باسي، په اوسط ډول، د ترلاسه شویو غوښتنو فریکونسۍ سره مساوي وي، د غوښتنې پروسس کولو وخت سره ضرب کیږي. هغوی. زموږ په قضیه کې اوسط. د ډیسک قطار اوږدوالی = (د ډیسک لیږد/سیکنډ) * (اوسط ډیسک ثانی/لیږدول).

      اګست د ډیسک قطار اوږدوالی د ډیسک فرعي سیسټم د کاري بار ټاکلو لپاره د یو اصلي شمیرونکي په توګه ورکړل شوی ، په هرصورت ، د دې کافي اندازې کولو لپاره ، دا اړینه ده چې د ذخیره کولو سیسټم فزیکي جوړښت په سمه توګه نمایندګي وکړي. د مثال په توګه، د یو واحد هارډ ډیسک لپاره، د 2 څخه ډیر ارزښت مهم ګڼل کیږي، او که چیرې ډیسک د 4 ډیسکونو په RAID صف کې موقعیت ولري، نو تاسو باید اندیښنه ولرئ که چیرې ارزښت د 4 * 2 = 8 څخه ډیر وي.

      زبیبکس: perf_counter[LogicalDisk(_Total)Avg. د ډیسک قطار اوږدوالی]، او دا هم مهمه ده چې د مطلوب ډیسک تعقیب وساتئ، د بیلګې په توګه: perf_counter[LogicalDisk(C:)Avg. د ډیسک قطار اوږدوالی]

  2. د حافظې
    1. پاڼې/ثاني
      د هغو پاڼو شمیر ښیي چې SQL سرور له ډیسک څخه لوستل یا ډیسک ته لیکلي ترڅو د حافظې پا pagesو ته لاسرسی حل کړي چې د لاسرسي په وخت کې اصلي حافظې ته نه و پورته شوي. دا ارزښت د مخونو د ننوتلو/sec او د مخونو محصول/sec ارزښتونو مجموعه ده، او همدارنګه د غوښتنلیک ډیټا فایلونو ته د لاسرسي لپاره د سیسټم کیچ پاڼې (swapping/swapping) په پام کې نیسي. پدې کې د غیر زیرمه شوي مستقیم حافظې نقشه شوي فایلونو پاڼه کول هم شامل دي. دا د لیدلو لپاره اصلي کاونټر دی که تاسو د لوړې حافظې کارونې تجربه کوئ او د ډیرو مخونو تړلو سره. دا کاونټر د تبادلې مقدار مشخصوي او د هغې نورمال (نه لوړ) ارزښت باید صفر ته نږدې وي. په تبادله کې زیاتوالی د RAM زیاتولو یا په سرور کې د چلولو غوښتنلیکونو شمیر کمولو اړتیا په ګوته کوي.

      زبیبکس: perf_counter[MemoryPages/sec] د محرک مثال:
      {NOTE_NAME:perf_counter[MemoryPages/sec].min(5m)}>1000، کچه-معلومات

    2. د پاڼې نیمګړتیاوې/sec

      دا د پاڼې غلطی کاونټر ارزښت دی. د پاڼې غلطي هغه وخت رامینځته کیږي کله چې یوه پروسه د مجازی حافظې پاڼې ته اشاره کوي چې د RAM کاري سیټ کې ندي. دا کاونټر د پاڼې هغه نیمګړتیاوې په پام کې نیسي چې د ډیسک لاسرسي ته اړتیا لري او هغه چې د پاڼې له امله رامینځته شوي چې په 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 [د یادښت موجود بایټس]

  3. پروسیسر (ټول): د پروسیسر وخت٪
    دا کاونټر د هغه وخت سلنه ښیي چې پروسیسر د غیر فعال تارونو (غیر غیر فعال تار) لپاره په عملیاتو کې بوخت و. دا ارزښت د ګټور کار ترسره کولو لپاره د اړتیا وړ وخت یوه برخه ګڼل کیدی شي. هر پروسیسر یو غیر فعال تار ته ټاکل کیدی شي چې غیر تولیدي پروسیسر سایکلونه مصرفوي چې د نورو تارونو لخوا نه کارول کیږي. دا کاونټر د لنډو چوټو لخوا مشخص شوی چې کولی شي 100 سلنې ته ورسیږي. که څه هم، که چیرې د پروسیسر کارول د 80 سلنې څخه پورته وي، اوږد مهاله وي، نو سیسټم به ډیر اغیزمن وي کله چې د ډیرو پروسیسرونو کارول.

    زبیبکس: perf_counter[Processor(_Total)٪ د پروسیسر وخت]، دلته دا د کور لخوا هم ښودل کیدی شي
    د محرک مثال:
    {NODE_NAME:perf_counter[Processor(_Total)% پروسیسر وخت].min(5m)}>80، د کچې معلومات

  4. د شبکې انټرفیس (*):٪ بایټس مجموعه/سیکنډه
    په ټولو انٹرفیسونو کې په هره ثانیه کې لیږل شوي او ترلاسه شوي بایټس ټولټال شمیر. دا د انٹرفیس بینډ ویت دی (په بایټس کې). دا اړینه ده چې د دې کاونټر ارزښت د شبکې کارت اعظمي بینډ ویت سره پرتله کړئ. په عموم کې، دا کاونټر باید له 50٪ څخه زیات د شبکې اډاپټر بینډ ویت کارول ونه ښیې.
    زبیبکس: perf_counter[نیټ ورک انٹرفیس(*)بایټس لیږل/سیکنډ]
  5. د MS SQL سرور: د لاسرسي میتودونه
    په SQL سرور کې د لاسرسي میتود اعتراض کاونټرونه چمتو کوي ترڅو تاسو سره په ډیټابیس کې منطقي معلوماتو ته لاسرسي تعقیبولو کې مرسته وکړي. په ډیسک کې ډیټابیس پاڼو ته فزیکي لاسرسی د بفر مدیر شمیرونکو لخوا کنټرول کیږي. په ډیټابیس کې ډیټا ته د لاسرسي میتودونو مشاهده کول تاسو سره مرسته کوي چې معلومه کړي چې ایا تاسو کولی شئ د شاخصونو په اضافه کولو یا بدلولو سره د پوښتنو فعالیت ښه کولی شئ ، د برخې اضافه کول یا حرکت کول ، د فایلونو یا ګروپونو اضافه کول ، د شاخصونو ډیفراګمینټ کول ، یا د پوښتنې متن بدلول. تاسو کولی شئ د لاسرسي میتود اعتراض کې کاونټرونه هم وکاروئ ترڅو په ډیټابیس کې د ډیټا اندازه ، شاخصونه او خالي ځای وڅارئ ، د هر سرور مثال لپاره حجم کنټرول او ټوټې کول. د شاخصونو ډیرې ټوټې کول کولی شي د پام وړ فعالیت خراب کړي.

    1. د پاڼې ویش/ ثانیه
      په هره ثانیه کې د پاڼې د وقفې شمیره چې د شاخص پاڼې د ډیریدو په پایله کې پیښ شوي. د دې شاخص لوی ارزښت پدې معنی دی چې SQL سرور د پا pagesو ویشلو لپاره د سرچینو پراخه عملیات ترسره کوي او د موجوده پاڼې برخه نوي ځای ته لیږدوي کله چې د داخلولو او تازه کولو عملیات ترسره کوي. دا ډول عملیات باید هرکله چې امکان ولري مخنیوی وشي. تاسو کولی شئ په دوه لارو د ستونزې حل کولو هڅه وکړئ:
      - د اتوماتیک زیاتوالي کالمونو کې کلستر شوی شاخص رامینځته کړئ. په دې حالت کې، نوې ننوتل به د مخونو دننه نه وي چې مخکې د معلوماتو لخوا نیول شوي وي، مګر په ترتیب سره به نوي پاڼې ونیسي؛
      - د Fillfactor پیرامیټر ارزښت زیاتولو سره شاخصونه بیا جوړ کړئ. دا اختیار د شاخص پاڼو کې وړیا ځای ته اجازه ورکوي چې د پاڼې کولو اړتیا پرته د نوي معلوماتو لپاره خوندي شي.
      زبیبکس: perf_counter["MSSQL$InstanceName:د لاسرسي طریقې د پاڼې ویش/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$InstanceName:د لاسرسي میتودونه بشپړ سکین/sec",30]

  6. د MS SQL سرور: د بفر مدیر
    د بفر مدیر اعتراض کاونټرونه چمتو کوي ترڅو څارنه وکړي چې څنګه SQL سرور لاندې سرچینې کاروي:
    - د معلوماتو پاڼو ذخیره کولو لپاره حافظه؛
    - کاونټرونه د فزیکي I/O څارلو لپاره کارول کیږي کله چې SQL سرور د ډیټابیس پاڼې لوستل او لیکي؛
    - د بفر حوض پراخول ترڅو د ګړندي غیر متزلزل حافظې په کارولو سره د بفر کیچ پراخه کړي ، لکه سالډ سټیټ ډرایو (SSD)؛
    - د SQL سرور لخوا کارول شوي حافظې او کاونټرونو څارنه د لاندې معلوماتو ترلاسه کولو کې مرسته کوي؛
    - ایا د فزیکي حافظې د نشتوالي له امله کوم "خنډونه" شتون لري؟ که چیرې په مکرر ډول لاسرسي شوي ډیټا ذخیره نشي ، نو SQL سرور دې ته اړ کیږي چې دا له ډیسک څخه ولولي؛
    - ایا دا ممکنه ده چې د پوښتنو اجرا کولو موثریت د حافظې مقدار زیاتولو سره یا د ډیټا کیچ کولو یا د SQL سرور داخلي جوړښتونو ذخیره کولو لپاره اضافي حافظې تخصیص کولو سره؛
    څو ځله SQL سرور د ډیسک څخه ډاټا لوستل کوي. د نورو عملیاتو په پرتله، لکه د حافظې لاسرسی، فزیکي I/O ډیر وخت نیسي. د I/O کمول کولی شي د پوښتنو فعالیت ښه کړي.

    1. د بفر کیچ هټ راډیو
      په ګوته کوي چې څنګه په بشپړ ډول SQL سرور کولی شي په کیچ بفر کې ډاټا تخصیص کړي. څومره چې دا ارزښت لوړ وي، ښه. د دې لپاره چې د SQL سرور په مؤثره توګه ډیټا پا pagesو ته لاسرسی ومومي ، دوی باید په کیچ بفر کې وي او هیڅ فزیکي داخل/آؤټ پټ (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-media
    2. د پاڼې د ژوند تمه
      دا په ګوته کوي چې پاڼه به څومره وخت په خپل اوسني حالت کې د تل لپاره په حافظه کې پاتې شي. که ارزښت کمیږي، دا پدې مانا ده چې سیسټم د بفر پول څخه ډیر کار کوي. په دې توګه، د حافظې عملیات کولی شي په بالقوه توګه ستونزې رامینځته کړي چې د فعالیت تخریب لامل کیږي. د یادولو وړ ده چې دلته هیڅ نړیوال شاخص شتون نلري چې لاندې یې یو څوک په واضح ډول قضاوت کولی شي چې سیسټم د بفر پول څخه ناوړه ګټه پورته کوي (د 300 ثانیو شاخص د MS SQL Server 2012 سره متروک دی).
      زبیبکس: perf_counter["MSSQL$INSTENTION_NAME: د بفر مدیر پاڼې د ژوند اټکل"، 30] د محرک مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:Buffer ManagerPage د ژوند اټکل", 30].last()}<5, د کچې معلومات

  7. د MS SQL سرور: عمومي احصایې
    په SQL سرور کې د عمومي احصایې اعتراض کاونټرونه چمتو کوي چې تاسو ته اجازه درکوي د سرور عمومي فعالیت وڅاري، لکه د سمو اړیکو شمیر او په هر ثانیه کې د کاروونکو شمیر چې د SQL سرور مثال چلوي له کمپیوټر سره وصل یا منقطع کیږي. دا میټریکونه د لوی آنلاین لیږد پروسس کولو (OLTP) سیسټمونو کې ګټور دي چیرې چې لوی شمیر پیرودونکي په دوامداره توګه د SQL سرور مثال څخه وصل او منحل کیږي.

    1. پروسه بنده شوه
      د اوسني بند شوي پروسو شمیر.
      زبیبکس: perf_counter["MSSQL$INSPECTION_NAME: عمومي احصایې پروسې بندې شوې"، 30] د محرک مثال: ({NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:د عمومي احصایې پروسې بندې شوې"،30].min(2m,0)}>=0)
      او ({NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME: عمومي احصایې پروسې بندې شوې"، 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: عمومي احصایې د کارونکي اړیکې"، 30]

  8. د MS SQL سرور: لاکونه
    د مایکروسافټ SQL سرور کې لاکز اعتراض د انفرادي سرچینو ډولونو کې ترلاسه شوي د SQL سرور لاکونو په اړه معلومات چمتو کوي. لاکونه د SQL سرور سرچینو باندې صادر شوي ، لکه قطارونه د لیږد لخوا لوستل یا بدل شوي ، ترڅو په ورته وخت کې د سرچینو کارولو څخه د ډیری لیږدونو مخه ونیسي. د مثال په توګه، که چیرې یو ځانګړی (X) قفل په میز کې په قطار کې د لیږد په واسطه ترلاسه شي، نور هیڅ معامله نشي کولی دا قطار بدل کړي تر هغه چې قفل خوشې نشي. د قفلونو کارول کمول همغږي زیاتوي، کوم چې کولی شي ټولیز فعالیت ښه کړي. د لاک څیز ډیری مثالونه په ورته وخت کې تعقیب کیدی شي ، چې هر یو به په مختلف ډول سرچینې کې د لاک نمایندګي وکړي.

    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. د بند غوښتنې/sec
      د ټاکل شوي لاک ډول لپاره په هره ثانیه کې د غوښتنو شمیر.
      زبیبکس: 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، د معلوماتو کچه
    6. د بند شمیره / ثانیه
      په هره ثانیه کې د تالاشۍ غوښتنې شمیر چې د ځنډیدو لامل کیږي. ډیډ لاکونه ناسمې پوښتنې په ګوته کوي چې شریکې سرچینې بندوي.
      زبیبکس: perf_counter["MSSQL$INSTENTION_NAME: د بندونو شمیر/سیکنډ"، 30] د محرک مثال: {NODE_NAME:perf_counter["MSSQL$INSPECTION_NAME:Locks(_Total)Number of Deadlocks/sec",30].last()}>1، کچه لوړه

  9. د MS SQL سرور: د حافظې مدیر
    د مایکروسافټ ایس کیو ایل سرور کې د حافظې مدیر اعتراض د سرور په کچه د حافظې کارولو نظارت کولو لپاره کاونټرونه چمتو کوي. د کاروونکي فعالیت او د سرچینو کارولو ارزولو لپاره د سرور په کچه د حافظې کارولو څارنه کولی شي د فعالیت خنډونو پیژندلو کې مرسته وکړي. د حافظې کنټرول د SQL سرور مثال لخوا کارول کیدی شي په ټاکلو کې مرسته وکړي:
    - ایا په کافي فزیکي حافظه کې کمبود شتون لري ترڅو په کیچ کې په مکرر ډول لاسرسي شوي ډیټا ذخیره کړي. که چیرې کافي حافظه شتون ونلري، SQL سرور باید د ډیسک څخه ډاټا بیرته ترلاسه کړي؛
    - ایا د پوښتنو فعالیت ښه کیدی شي که چیرې ډیر حافظه اضافه شي یا د ډیټا کیشینګ یا SQL سرور داخلي جوړښتونو لپاره ډیرې حافظې شتون ولري.

    1. د یادونې وړ مرستې
      د پروسو ټول شمیر مشخص کوي چې په بریالیتوب سره د کاري ځای حافظه ترلاسه کړې. په شاخص کې د ثابت کمښت سره، دا اړینه ده چې رام زیات کړئ.
      زبیبکس: perf_counter["MSSQL$INSTENTION_NAME: د حافظې مدير د يادونې وړ مرستې"، 30]
    2. د یادونې وړ مرستې پاتې دي
      د پروسو ټول شمیر په ګوته کوي چې د کاري حافظې د ورکولو لپاره انتظار باسي. د شاخص د باثباته ودې سره، دا اړینه ده چې رام زیات کړئ.
      زبیبکس: perf_counter["MSSQL$InstanceName:Memory ManagerMemory Grants Pending"،30]

  10. د MS SQL سرور: احصایې
    د مایکروسافټ ایس کیو ایل سرور کې د احصایې اعتراض د SQL سرور مثال ته لیږل شوي تالیف او پوښتنو ډولونو نظارت کولو لپاره کاونټرونه چمتو کوي. د پوښتنو تالیفونو او بیا ترکیبونو شمیر څارنه او د SQL سرور د مثال لخوا ترلاسه شوي بستونو شمیره تاسو ته دا نظر درکوي چې SQL سرور څومره ژر د کارونکي پوښتنې اجرا کوي او د پوښتنې اصلاح کونکی دوی څومره مؤثره پروسس کوي.

    1. د بست غوښتنې/سیکنډ
      د Transact-SQL کمانډ پاکټونو شمیر په هره ثانیه کې ترلاسه شوی. دا احصایې د هر ډول محدودیتونو لخوا اغیزمن کیږي (I/O، د کاروونکو شمیر، د کیچ اندازه، د پوښتنو پیچلتیا، او نور). د بسته بندۍ غوښتنې لوړه شمیره د لوړې کچې په ګوته کوي.
      زبیبکس: perf_counter["MSSQL$InstanceName:SQL StatisticsBatch Requests/sec",30]

د پورتنیو ټولو سربیره، تاسو کولی شئ د معلوماتو نور عناصر هم تنظیم کړئ (همدارنګه د راتلونکي خبرتیا سره په دوی باندې محرکونه رامینځته کړئ) د مثال په توګه:
1) وړیا ډیسک ځای
2) د DB ډیټا فایلونو اندازه او د لاګ لاګ
او داسې نور.
په هرصورت، دا ټول شاخصونه د ریښتینې وخت پوښتنې ستونزه نه ښیي.
د دې کولو لپاره، تاسو اړتیا لرئ خپل ځانګړي کاونټرونه جوړ کړئ.
د محرمیت دلایلو له امله، زه به د داسې شمیرو مثالونه وړاندې نه کړم. سربیره پردې ، دوی د هر سیسټم لپاره په ځانګړي ډول تنظیم شوي. مګر زه یادونه کوم چې د سیسټمونو لپاره لکه 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

بیا ، تاسو اړتیا لرئ هغه فولډر ته لاړشئ چیرې چې زبیکس موقعیت لري (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_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 فایل خوندي کوو او د زیبکس ایجنټ بیا پیل کوو.
له هغې وروسته، موږ په زبکس کې دوه نوي عناصر اضافه کوو (په دې حالت کې، نومونه او کلیدي ورته دي):
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;

نتيجه

دا مقاله په زبیکس کې د فعالیت کاونټرونو (توکیو) بیلګه پوښلې ده. دا طریقه تاسو ته اجازه درکوي مدیرانو ته په ریښتیني وخت یا یو ټاکلي وخت کې د مختلف ستونزو په اړه خبر ورکړئ. په دې توګه، دا طریقه اجازه ورکوي چې په راتلونکي کې د یوې جدي ستونزې پیښې کمې کړي او د DBMS او سرور عملیات ودروي، کوم چې په پایله کې تولید د کار پروسې بندولو څخه ساتي.
مخکینی مقاله: په MS SQL سرور کې د معلوماتو سیسټم ډیټابیس 24 × 7 سره معمول کار

سرچینې:

» زیبکس 3.4
» د فعالیت شمیرونکي
» د Azure SQL ډیټابیس او SQL سرور ډیټابیس انجن لپاره د فعالیت مرکز
» د SQL طرز ژوند
» SQLSkills
» د مایکروسافټ ټیکنیټ
» د حافظې کارولو تحلیل
» د فعالیت تحلیل
» د SQL اسناد
» د وینډوز یادښتونه

سرچینه: www.habr.com

Add a comment