Истифодаи Zabbix барои мониторинги пойгоҳи додаҳои MS SQL Server

Пешгуфтор

Аксар вақт зарурати гузориш додан ба мудир дар бораи мушкилоти марбут ба пойгоҳи додаҳо (базанаи маълумот) вуҷуд дорад.

Ин мақола шарҳ медиҳад, ки чӣ бояд дар Zabbix барои назорат кардани пойгоҳи додаҳои MS SQL Server танзим карда шавад.

Лутфан таваҷҷӯҳ намоед, ки тафсилот дар бораи тарзи конфигуратсия дода намешавад, аммо дар ин мақола формулаҳо ва тавсияҳои умумӣ, инчунин тавсифи муфассали илова кардани унсурҳои додаҳои фармоишӣ тавассути расмиёти захирашуда дода мешаванд.
Инчунин, дар ин ҷо танҳо ҳисобкунакҳои асосии иҷроиш баррасӣ хоҳанд шуд.

ҳалли

Аввалан, ман ҳамаи он ҳисобкунакҳои иҷроишро (тавассути унсурҳои маълумот дар Zabbix), ки ба мо лозиманд, тавсиф мекунам:

  1. Диски мантиқӣ
    1. Миёнаи Disc сек/Хондан
      Вақти миёнаро бо сонияҳо барои хондани маълумот аз диск нишон медиҳад. Арзиши миёнаи ҳисобкунаки иҷрои миёна. Disk sec/Read набояд аз 10 миллисония зиёд бошад. Арзиши максималии ҳисобкунаки иҷро Авг. Диски сония/Хондан набояд аз 50 миллисония зиёд бошад.

      Зарифӣ: perf_counter[LogicalDisk(_Total)Авг. Disk sec/Read], ва инчунин муҳим аст, ки пайгирӣ кардани диски дилхоҳ, масалан: perf_counter[LogicalDisk(C:)Avg. Диск сония/Хондан]

      Намунаҳои триггер:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Авг. Disk sec/Read].last()}>0.005, сатҳи баланд
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Авг. Disk sec/Read].last()}>0.0025, сатҳи миёна

    2. Миёнаи Disc сек/Навис
      Вақти миёнаро бо сонияҳо барои навиштани маълумот ба диск нишон медиҳад. Арзиши миёнаи ҳисобкунаки иҷрои миёна. Disk sec/Write набояд аз 10 миллисония зиёд бошад. Арзиши максималии ҳисобкунаки иҷро Авг. Disk sec/Write набояд аз 50 миллисония зиёд бошад.

      Зарифӣ: perf_counter[LogicalDisk(_Total)Авг. Disk sec/Write], ва инчунин муҳим аст, ки пайгирӣ кардани диски дилхоҳ, масалан: perf_counter[LogicalDisk(C:)Avg. Диск сония/Нависед]

      Намунаҳои триггер:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Авг. Disk sec/Write].last()}>0.005, сатҳи баланд
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Авг. Disk sec/Write].last()}>0.0025, сатҳи миёна

    3. Дарозии навбати миёнаи диск

      Давомнокии миёнаи навбати дархостҳо ба диск. Шумораи дархостҳои дискро, ки интизори коркард дар фосилаи вақти муайян шудаанд, нишон медиҳад. Навбати на бештар аз 2 барои як диск муқаррарӣ ҳисобида мешавад. Агар дар навбат зиёда аз ду дархост мавҷуд бошад, диск метавонад аз ҳад зиёд бор карда шавад ва дархостҳои воридшударо коркард карда наметавонад. Шумо метавонед аниқ фаҳмед, ки кадом амалҳоро диск бо истифода аз ҳисобкунакҳои Avg иҷро карда наметавонад. Дарозии навбати хондани диск ва миёна. Дарозии навбати диск Райт (навбати дархостҳои навиштан).
      Арзиши миёна Дарозии навбати диск чен карда намешавад, аммо бо истифода аз қонуни Литл аз назарияи математикии навбат ҳисоб карда мешавад. Тибқи ин қонун, шумораи дархостҳое, ки дар интизори баррасӣ қарор доранд, ба ҳисоби миёна ба басомади дархостҳо ба вақти коркарди дархост баробар аст. Онхое. дар ҳолати мо миёна. Дарозии навбати диск = (Интиқоли диск/сек) * (Миб. Диск сек/Интиқол).

      миёна. Дарозии навбати дискҳо ҳамчун яке аз ҳисобкунакҳои асосӣ барои муайян кардани сарбории зерсистемаи диск дода мешавад, аммо барои баҳодиҳии дурусти он сохтори физикии системаи нигаҳдории онро дақиқ нишон додан лозим аст. Масалан, барои як диски сахт арзиши бузургтар аз 2 муҳим ҳисобида мешавад ва агар диск дар массиви RAID аз 4 диск ҷойгир бошад, пас шумо бояд хавотир шавед, ки арзиши он аз 4*2=8 зиёд бошад.

      Зарифӣ: perf_counter[LogicalDisk(_Total)Авг. Дарозии навбати диск], ва инчунин муҳим аст, ки диски дилхоҳро пайгирӣ кунед, масалан: perf_counter[LogicalDisk(C:)Avg. Дарозии навбати диск]

  2. хотира
    1. Саҳифаҳо/сек
      Шумораи саҳифаҳоеро, ки SQL Server аз диск мехонад ё ба диск навиштааст, нишон медиҳад, то дастрасӣ ба саҳифаҳои хотираро, ки дар вақти дастрасӣ ба RAM бор карда нашудаанд, ҳал кунад. Ин қиммат ҷамъи Саҳифаҳои Вуруд/сон ва Саҳифаҳо Баромад/сония мебошад ва инчунин пейджинг (пейҷинг/ивазкунӣ)-и кэши системаро барои дастрасӣ ба файлҳои додаҳои барнома ба назар мегирад. Илова бар ин, ин пейджинги файлҳои кэшнашударо дар бар мегирад, ки бевосита ба хотира харита карда мешаванд. Ин ҳисобкунаки асосӣест, ки бояд назорат карда шавад, агар шумо истифодаи зиёди хотира ва пейджинги аз ҳад зиёди алоқамандро эҳсос кунед. Ин ҳисобкунак миқдори ивазкуниро тавсиф мекунад ва арзиши муқаррарии (на авҷи) он бояд ба сифр наздик бошад. Афзоиши ивазкунӣ аз зарурати зиёд кардани хотираи оперативӣ ё кам кардани шумораи барномаҳои барномавӣ, ки дар сервер кор мекунанд, нишон медиҳад.

      Зарифӣ: perf_counter[Саҳифаҳои хотира/сония] Намунаи триггер:
      {NODE_NAME:perf_counter[MemoryPages/sec].min(5м)}>1000, маълумот дар сатҳи

    2. Хатогиҳои саҳифа/сек

      Ин арзиши ҳисобкунаки хатои саҳифа аст. Хатогии саҳифа вақте рух медиҳад, ки раванд ба саҳифаи хотираи виртуалӣ, ки дар маҷмӯи кории RAM нест, истинод мекунад. Ин ҳисобкунак ҳам он хатогиҳои саҳифаро, ки дастрасии дискро талаб мекунанд ва ҳам хатогиҳоеро, ки дар натиҷаи берун аз маҷмӯи кории дар RAM берун будани саҳифа ба вуҷуд омадаанд, ба назар мегирад. Аксари протсессорҳо метавонанд хатогиҳои саҳифаи навъи XNUMX-ро бидуни таъхири зиёд ҳал кунанд. Аммо, коркарди хатогиҳои саҳифаи навъи XNUMX, ки дастрасии дискро талаб мекунанд, метавонад боиси таъхирҳои назаррас гардад.

      Зарифӣ: perf_counter[Хатоҳои саҳифаи хотира/сония] Намунаи триггер:
      {NODE_NAME:perf_counter[Хатоҳои MemoryPage/sec].дақ(5м)}>1000, маълумот дар сатҳи

    3. Байтҳои дастрас

      Миқдори хотираи байтҳоро барои иҷро кардани равандҳои гуногун пайгирӣ мекунад. Хонишҳои паст нишон медиҳанд, ки хотираи кам. Роҳи ҳалли он зиёд кардани хотира аст. Ин ҳисобкунак дар аксар ҳолатҳо бояд доимо аз 5000 кВ бошад.
      Бо сабабҳои зерин ба таври дастӣ ҳадди ақалли Мбайтҳои дастрасро муқаррар кардан маъно дорад:

      •50% хотираи озод дастрас = Аъло
      •25% хотираи дастрас = Диққат лозим аст
      •10% ройгон = Мушкилоти эҳтимолӣ
      •Камтар аз 5% хотираи дастрас = Барои суръат муҳим аст, шумо бояд дахолат кунед.
      Зарифӣ: perf_counter[Байтҳои хотираи дастрас]

  3. Протсессори (Ҳамӣ): % Вақти коркардкунанда
    Ин ҳисобкунак фоизи вақтро нишон медиҳад, ки протсессор бо иҷрои амалиётҳо барои риштаҳои ғайрифаъол банд буд. Ин арзишро метавон ҳамчун таносуби вақти барои кори муфид сарфшуда баррасӣ кард. Ҳар як протсессорро метавон ба риштаи бекор таъин кард, ки давраҳои протсессори бесамарро, ки риштаҳои дигар истифода намебаранд, истеъмол мекунад. Ин ҳисобкунак бо қуллаҳои кӯтоҳ тавсиф карда мешавад, ки метавонанд ба 100 фоиз расонанд. Аммо, агар давраҳои тӯлонӣ вуҷуд дошта бошанд, ки истифодаи протсессор аз 80 фоиз зиёд аст, пас система бо истифода аз протсессори бештар самараноктар хоҳад буд.

    Зарифӣ: perf_counter[Processor(_Total)% Time Processor], дар ин ҷо он инчунин метавонад аз ҷониби аслӣ нишон дода шавад
    Намунаи триггер:
    {NODE_NAME:perf_counter[Процессор(_Умумии)% Вақти коркард].дақ(5м)}>80, маълумот дар сатҳи

  4. Интерфейси шабакавӣ (*): % Байтҳо Ҳамагӣ/сон
    Шумораи умумии байтҳои фиристодашуда ва қабулшуда дар як сония дар тамоми интерфейсҳо. Ин маҷрои интерфейс аст (бо байт). Зарур аст, ки арзиши ин ҳисобкунакро бо ҳадди фарохмаҷрои корти шабака муқоиса кунед. Умуман, ин ҳисобкунак набояд на бештар аз 50% истифодаи маҷрои адаптери шабакаро нишон диҳад.
    Зарифӣ: perf_counter[Интерфейси шабакавӣ(*)Байтҳо фиристода/сон]
  5. MS SQL Server: Усулҳои дастрасӣ
    Объекти усулҳои дастрасӣ дар SQL Server ҳисобкунакҳоро таъмин мекунад, то дастрасӣ ба маълумоти мантиқӣ дар дохили пойгоҳи додаҳоро пайгирӣ кунанд. Дастрасии ҷисмонӣ ба саҳифаҳои пойгоҳи додаҳо дар диск бо истифода аз ҳисобкунакҳои мудири буферӣ назорат карда мешавад. Мониторинги усулҳои дастрасии додаҳо дар пойгоҳи додаҳо ба муайян кардани он, ки оё иҷрои дархостро тавассути илова кардан ё тағир додани индексҳо, илова кардан ё интиқол додани қисмҳо, илова кардани файлҳо ё гурӯҳҳои файлҳо, дефрагментация кардани индексҳо ё тағир додани матни дархост метавон беҳтар кард, кӯмак мекунад. Илова бар ин, шумо метавонед ҳисобкунакҳои объекти Access Methods -ро барои назорат кардани андозаи маълумот, индексҳо ва фазои холӣ дар пойгоҳи додаи худ, мониторинги қобилият ва тақсимоти ҳар як мисоли сервер истифода баред. Тақсимоти аз ҳад зиёди индекс метавонад иҷроишро ба таври назаррас коҳиш диҳад.

    1. Тақсимоти саҳифа/с
      Шумораи тақсимоти саҳифа дар як сония, ки дар натиҷаи пур шудани саҳифаи индекс анҷом дода мешавад. Арзиши баланд барои ин метрика маънои онро дорад, ки ҳангоми иҷрои амалиёти воридкунӣ ва навсозӣ дар додаҳо, SQL Server бояд шумораи зиёди амалиётҳои захиравиро барои тақсим кардани саҳифаҳо ва интиқоли як қисми саҳифаи мавҷуда ба макони нав иҷро кунад. То ҳадди имкон аз чунин амалиётҳо худдорӣ кардан лозим аст. Шумо метавонед кӯшиш кунед, ки мушкилотро бо ду роҳ ҳал кунед:
      — индекси кластерӣ барои сутунҳои худкор афзоишёбанда эҷод кунед. Дар ин ҳолат, сабтҳои нав дар дохили саҳифаҳое, ки аллакай бо маълумот ишғол карда шудаанд, ҷойгир карда намешаванд, балки пайдарпай саҳифаҳои навро ишғол мекунанд;
      — аз нав сохтани индексҳо тавассути баланд бардоштани арзиши параметри Fillfactor. Ин хосият ба шумо имкон медиҳад, ки фазои холӣ дар саҳифаҳои индекс, ки барои ҷойгир кардани маълумоти нав истифода мешаванд, бидуни ниёз ба амалиёти тақсимкунии саҳифа захира кунед.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME: 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]. /5, сатҳ-маълумот
    2. Сканҳои пурра / сония
      Шумораи номаҳдуди сканҳои пурра дар як сония. Ин амалиётҳо сканҳои ҷадвали асосӣ ва сканҳои пурраи индексро дар бар мегиранд. Афзоиши мӯътадили ин нишондиҳанда метавонад таназзули системаро нишон диҳад (набудани индексҳои зарурӣ, тақсимоти шадиди онҳо, нокомии оптимизатор дар истифодаи индексҳои мавҷуда, мавҷудияти индексҳои истифоданашуда). Бо вуҷуди ин, бояд қайд кард, ки сканкунии пурра дар ҷадвалҳои хурд на ҳамеша бад аст, зеро агар шумо метавонед тамоми ҷадвалро дар RAM ҷойгир кунед, пас сканкунии пурра тезтар мешавад. Аммо дар аксари мавридҳо, афзоиши устувори ин ҳисобкунӣ таназзули системаро нишон медиҳад. Ҳамаи ин танҳо барои системаҳои OLTP дахл дорад. Дар системаҳои OLAP, сканҳои доимии пурра муқаррарӣ мебошанд.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME: Дастрасӣ ба Усулҳои Сканҳои пурра/сония",30]

  6. MS SQL Server: Менеҷери буферӣ
    Объекти менеҷери буфер ҳисобкунакҳоро таъмин мекунад, ки ба шумо назорат мекунанд, ки чӣ тавр SQL Server захираҳои зеринро истифода мебарад:
    — хотира барои нигоҳ доштани саҳифаҳои маълумот;
    - ҳисобкунакҳое, ки вуруди ҷисмониро назорат мекунанд, вақте ки SQL Server саҳифаҳоро мехонад ва менависад;
    — тавсеаи ҳавзи буферӣ барои васеъ кардани кэши буферӣ бо истифода аз хотираи зуди идоранашаванда, ба монанди дискҳои ҳолати сахт (SSD);
    - Мониторинги хотира ва ҳисобкунакҳое, ки аз ҷониби SQL Server истифода мешаванд, барои ба даст овардани маълумоти зерин мусоидат мекунанд;
    — оё монеаҳое вуҷуд доранд, ки аз сабаби нарасидани хотираи ҷисмонӣ ба вуҷуд омадаанд. Агар маълумоти зуд дастрасшаванда дар кэш нигоҳ дошта нашавад, SQL Server маҷбур аст, ки онро аз диск хонад;
    Оё тавассути зиёд кардани ҳаҷми хотира ё ҷудо кардани хотираи иловагӣ барои кэш маълумот ё нигоҳ доштани сохторҳои дохилии SQL Server иҷрои дархостҳоро беҳтар кардан мумкин аст?
    — то чӣ андоза SQL Server маълумотро аз диск мехонад. Дар муқоиса бо дигар амалиётҳо, ба монанди дастрасии хотира, барои ба итмом расонидани вуруди физикӣ / баромад вақти зиёдтар мегирад. Коҳиш додани вуруд/чор метавонад иҷрои дархостҳоро беҳтар кунад.

    1. Buffer Cache радиоро пахш кард
      Нишон медиҳад, ки чӣ қадар SQL Server метавонад ба буфери кэш мувофиқат кунад. Ҳар қадаре ки ин арзиш баланд бошад, ҳамон қадар беҳтар аст, зеро Барои дастрасии муассири SQL Server ба саҳифаҳои додаҳо, онҳо бояд дар буфери кэш бошанд ва ҳеҷ гуна амалиёти воридот/баромади физикӣ (В/О) мавҷуд набошад. Агар шумо коҳиши устувори арзиши миёнаи ин ҳисобкунакро бинед, шумо бояд илова кардани RAM-ро баррасӣ кунед. Ин нишондиҳанда бояд ҳамеша барои системаҳои OLTP аз 90% ва барои системаҳои OLAP аз 50% зиёд бошад.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Буфер Менеҷери буфери таносуби хит кэши буфер",30] Намунаҳои триггер: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer Manager Таносуби хит кэш",30].last()}<70, сатҳи баланд
      и
      {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer Manager Таносуби хит кэш",30].last()}<80, сатҳи миёна
    2. Давомнокии умри саҳифа
      Нишон медиҳад, ки саҳифа то чӣ андоза дар ҳолати ҷории худ дар хотираи доимӣ боқӣ мемонад. Агар арзиш коҳиш ёбад, ин маънои онро дорад, ки система ҳавзи буфериро сӯиистифода мекунад. Аз ин рӯ, иҷрои хотира метавонад эҳтимолан мушкилотро ба вуҷуд оварад, ки ба кори суст оварда мерасонад. Қобили зикр аст, ки ягон нишондиҳандаи универсалӣ вуҷуд надорад, ки дар зер ба таври возеҳ ҳукм кардан мумкин аст, ки система аз ҳавзи буферӣ сӯиистифода мекунад (нишондиҳандаи 300 сония аз MS SQL Server 2012 кӯҳна шудааст).
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Муддати умри мудири буфери саҳифа",30] Намунаи триггер: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Мӯҳлати умри мудири буферӣ",30].last()}<5, сатҳи-маълумот

  7. MS SQL Server: Омори умумӣ
    Объекти омори умумӣ дар SQL Server ҳисобкунакҳоро таъмин мекунад, ки ба шумо имкон медиҳанд, ки фаъолияти умумии серверро назорат кунед, ба монанди шумораи пайвастҳои ҳамзамон ва шумораи корбарон дар як сония ба компютере, ки намунаи SQL Server кор мекунад, пайваст мешаванд ё ҷудо мешаванд. Ин нишондиҳандаҳо дар системаҳои бузурги коркарди транзаксияҳои онлайн (OLTP), ки шумораи зиёди муштариён пайваста аз як мисоли SQL Server пайваст ва ҷудо мешаванд, муфид аст.

    1. Раванд баста шуд
      Шумораи равандҳои дар айни замон басташуда.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Равандҳои омори умумӣ баста шудаанд",30] Намунаи триггер: ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Процессҳои омори умумӣ баста шудаанд",30].дақ(2м,0)}>=0)
      ва ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Processes General Statistics blocked",30].time(0)}>=50000)
      ва ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses blocked",30].time(0)}<=230000), сатҳи иттилоот (дар ин ҷо маҳдудияти сигнализатсия аз 05:00 то 23:00 мавҷуд аст)
    2. Пайвастҳои корбар
      Шумораи корбароне, ки ҳоло ба SQL Server пайвастанд.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Пайвастҳои умумии StatisticsUser",30]

  8. MS SQL Server: Қулфҳо
    Объекти Қулфҳо дар Microsoft SQL Server маълумотро дар бораи қулфҳои SQL Server, ки барои намудҳои инфиродии захираҳо гирифта шудаанд, таъмин мекунад. Қулфҳо дар захираҳои SQL Server дода мешаванд, ба монанди сатрҳо, ки тавассути транзаксия хонда мешаванд ё тағир дода мешаванд, барои пешгирӣ кардани истифодаи якчанд транзаксия дар як вақт. Масалан, агар қулфи истисноии (X) тавассути транзаксия дар сатри ҷадвал ба даст оварда шавад, ҳеҷ як амалиёти дигар наметавонад он сатрро то кушода шудани қулф тағйир диҳад. Кам кардани истифодаи қуфлҳо ҳамзамонро зиёд мекунад, ки метавонад кори умумиро беҳтар кунад. Якчанд мисолҳои объекти Қулфҳоро дар як вақт пайгирӣ кардан мумкин аст, ки ҳар яки онҳо қулфро дар намуди алоҳидаи захираҳо намояндагӣ мекунанд.

    1. Вақти миёнаи интизорӣ (ms)
      Давомнокии миёнаи интизорӣ (бо миллисонияҳо) барои ҳама дархостҳои қулф, ки интизориро талаб мекарданд. Ин ҳисобкунак нишон медиҳад, ки ба ҳисоби миёна равандҳои корбар барои ба даст овардани қулф дар захира чӣ қадар вақт бояд дар навбат интизор шаванд. Арзиши максималии иҷозатдодашудаи ин ҳисобкунак комилан аз вазифаи шумо вобаста аст; муайян кардани ягон арзиши миёна барои ҳама барномаҳо душвор аст. Агар ин ҳисобкунак хеле баланд бошад, он метавонад мушкилоти бастани пойгоҳи додаи шуморо нишон диҳад.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Мӯҳлати миёнаи интизорӣ (ms)",30] Намунаи триггер: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Мӯҳлати миёнаи интизорӣ (ms)",30].last()}>=500, сатҳи маълумот
    2. Вақти интизории қулф (мс)
      Вақти умумии интизории қулф (бо миллисонияҳо) дар як сонияи охир.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Мӯҳлати интизории қулф (мс)",30]
    3. Қулф кардани интизорӣ/сон
      Миқдори маротиба дар сонияи охир, ки ришта аз сабаби дархости қулф интизор мешуд.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Қулф интизорӣ/сон",30]
    4. Қулф кардани вақтҳо/с
      Миқдори маротибае, ки қулфро бо усули даврӣ ба даст овардан мумкин нест. Қимати параметри конфигуратсияи ҳисобкунаки SQL Server муайян мекунад, ки ришта то ба охир расидани вақт ва ғайрифаъол шудани ришта чанд маротиба метавонад чарх занад.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Мӯҳлати Қулф/сон",30] Намунаи триггер: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Locks(_Total)Lock Timeouts/sec",30].last()}>1000, information level
    5. Қулф кардани дархостҳо/сек
      Шумораи дархостҳо дар як сонияи навъи қулфи муайяншуда.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Дархостҳои қулф/сон",30] Намунаи триггер: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Requests/sec",30].last()}>500000, маълумот сатҳи
    6. Шумораи қуфлҳо/сония
      Шумораи дархостҳои қулф дар як сония, ки ба бунбаст оварда мерасонад. Мавҷудияти бунбастҳо нишон медиҳад, ки дархостҳои суст сохташуда, ки захираҳои муштаракро бозмедоранд.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Миқдори бастаҳо/сония",30] Намунаи триггер: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Қулфҳо(_Total)Миқдори бастаҳо/сония",30]. Last()}>1, сатҳи баланд

  9. MS SQL Server: Менеҷери хотира
    Объекти менеҷери хотира дар Microsoft SQL Server ҳисобкунакҳоро барои назорат кардани истифодаи хотираи саросари сервер таъмин мекунад. Мониторинги истифодаи хотираи тамоми сервер барои арзёбии фаъолияти корбар ва истифодаи захираҳо метавонад барои муайян кардани монеаҳои кор кӯмак кунад. Мониторинги хотирае, ки аз ҷониби як мисоли SQL Server истифода мешавад, метавонад муайян кунад:
    — оё норасоии хотираи ҷисмонӣ барои нигоҳ доштани маълумоти зуд-зуд истифодашаванда дар кэш вуҷуд дорад. Агар хотираи кофӣ набошад, SQL Server бояд маълумотро аз диск гирад;
    - Оё иҷрои дархост метавонад беҳтар шавад, агар хотира илова карда шавад ё миқдори хотираи дастрас барои кэшкунии маълумот ё сохторҳои дохилии SQL Server зиёд карда шавад.

    1. Грантҳои хотираи барҷаста
      Шумораи умумии равандҳоеро, ки хотираи фазои кориро бомуваффақият ба даст овардаанд, нишон медиҳад. Агар индикатор бемайлон паст шавад, RAM-ро зиёд кардан лозим аст.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Менеҷери хотира Грантҳои барҷастаи хотира",30]
    2. Грантҳои хотира интизоранд
      Шумораи умумии равандҳоеро, ки интизори ҷудо кардани хотираи корӣ мебошанд, нишон медиҳад. Бо афзоиши муътадили индикатор, зиёд кардани RAM зарур аст.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:Менеҷери хотира Грантҳои хотира интизоранд",30]

  10. MS SQL Server: Омор
    Объекти омор дар Microsoft SQL Server ҳисобкунакҳоро барои назорат кардани ҷамъоварӣ ва намудҳои дархостҳое, ки ба намунаи SQL Server фиристода мешаванд, таъмин мекунад. Мониторинги шумораи ҷамъбастҳо ва такрори дархостҳо ва шумораи партияҳои аз ҷониби як мисоли SQL Server гирифташуда фаҳмиш медиҳад, ки SQL Server дархостҳои корбарро то чӣ андоза зуд иҷро мекунад ва оптимизатори дархост онҳоро то чӣ андоза самаранок коркард мекунад.

    1. Дархостҳои дастаҷамъӣ/сек
      Миқдори бастаҳои фармони Transact-SQL дар як сония. Ба ин омор ҳама гуна маҳдудиятҳо таъсир мерасонанд (ворид/чор, шумораи корбарон, андозаи кэш, мураккабии дархост ва ғайра). Шумораи зиёди дархостҳои бастаҳо нишон медиҳад, ки интиқоли баланд.
      Зарифӣ: perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsRequestsBatch/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 файлро бо васеъшавии ps1 (PowerShell) эҷод кунед ва дар ҳар яки онҳо рамзҳои зеринро нависед:
Рамз барои иҷро кардани дархостҳо

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

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

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

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

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

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

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

write-host $result;

Рамз барои дархостҳои интизоршуда

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

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

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

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

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

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

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

write-host $result;

Ҳоло шумо бояд файлеро бо параметрҳои корбар ва васеъшавии .conf эҷод кунед (ё ба файли мавҷудаи корбар сатрҳо илова кунед, агар он қаблан сохта шуда бошад) ва сатрҳои зеринро гузоред:
UserParameter=PARAMETER_NAME_NUMBER_of_QUERIES ИЧРО ШУД,powershell -NoProfile -ExecutionPolicy Bypass -Файл FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_EXECUTED_QUERYES.ps1
UserParameter=PARAMETER_NAME_NUMBER_WAITING_REQUESTS,powershell -NoProfile -ExecutionPolicy Bypass -Файл FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_WAITING_REQUESTS.ps1
Пас аз ин, файли .conf -ро захира кунед ва агенти Zabbix-ро аз нав оғоз кунед.
Пас аз ин, мо ба Zabbix ду унсури нав илова мекунем (дар ин ҳолат, номҳо ва калидҳо якхелаанд):
PARAMETRE_NAME_ШУМОРАИ АЗ_ДАРХОСТҲО ИЧРО ШУД
PARAMETER_NAME_NUMBER OF_WAITING_REQUESTS
Шумо ҳоло метавонед графикҳо ва триггерҳоро барои ададҳои додаҳои фармоишӣ эҷод кунед.

Агар шумораи дархостҳои интизоршуда якбора зиёд шавад, пас дархости зерин метавонад ҳама дархостҳои иҷрошаванда ва интизоршударо дар як вақт бо тафсилоти аз куҷо ва дар кадом логин иҷро шудани дархост, матн ва нақшаи дархост, инчунин тафсилоти дигар нишон диҳад:
рамз

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

Инчунин ба шумо хотиррасон мекунам, ки тибқи омори ҷамъшуда шумо метавонед саволҳои аз ҳама мушкилро ба даст оред:
рамз

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

Шумо инчунин метавонед барои MySQL нависед. Барои ин ба шумо лозим аст, ки насб кунед mysql-connector-net ва он гоҳ кодро чунин нависед:
Рамз барои дархостҳои интизоршуда

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

Дар натиҷа

Ин мақола ба мисоли ҳисобкунакҳои иҷроиш (маълумотҳо) дар Zabbix дида баромад. Ин равиш имкон медиҳад, ки маъмурон дар бораи мушкилоти гуногун дар вақти воқеӣ ё пас аз вақти муайян огоҳ карда шаванд. Ҳамин тариқ, ин равиш ба мо имкон медиҳад, ки дар оянда пайдоиши мушкилоти муҳимро ба ҳадди ақал расонем ва кори DBMS ва серверро қатъ кунем, ки дар навбати худ истеҳсолотро аз боздоштани равандҳои корӣ муҳофизат мекунад.
Мақолаи қаблӣ: Кори мунтазам бо пойгоҳи иттилоотии системаи иттилоотии 24×7 дар MS SQL Server

Манбаъҳо:

» Zabbix 3.4
» Ҳисобкунакҳои иҷроиш
» Маркази иҷроиш барои Azure SQL Database ва SQL Server Database Engine
» Тарзи ҳаёти SQL
» SQLSkills
» TechNet Microsoft
» Таҳлили истифодаи хотира
» Таҳлили иҷроиш
» Ҳуҷҷатҳои SQL
» Қайдҳо дар бораи Windows

Манбаъ: will.com

Илова Эзоҳ