Ke hoʻohana nei iā Zabbix e nānā i ka MS SQL Server Database

Kauwehe

Pono pinepine e hōʻike i ka luna hoʻomalu i ka manawa maoli e pili ana i nā pilikia e pili ana i ka waihona (database).

E wehewehe kēia ʻatikala i nā mea e pono ai ke hoʻonohonoho ʻia ma Zabbix e nānā i kahi waihona ʻikepili MS SQL Server.

E ʻoluʻolu, ʻaʻole e hāʻawi ʻia nā kikoʻī e pili ana i ka hoʻonohonoho ʻana, akā naʻe, e hāʻawi ʻia nā ʻōkuhi a me nā ʻōlelo aʻoaʻo maʻamau, a me ka wehewehe kikoʻī o ka hoʻohui ʻana i nā mea ʻikepili maʻamau ma o nā kaʻina hana mālama ʻia e hāʻawi ʻia i kēia ʻatikala.
Eia kekahi, ʻo nā helu helu hana nui wale nō e kūkākūkā ʻia ma aneʻi.

olelo hooholo

ʻO ka mea mua, e wehewehe wau i kēlā mau helu hana (ma o nā mea ʻikepili i Zabbix) e pono ai mākou:

  1. Disk Logical
    1. Awg Disc sec/Heluhelu
      Hōʻike i ka manawa maʻamau, i hōʻike ʻia i kekona, no ka heluhelu ʻana i ka ʻikepili mai ka disk. Awelika kumu kūʻai hoʻokō hana. ʻAʻole pono e ʻoi aku ma mua o 10 mau milliseconds. Waiwai kiʻekiʻe loa o ka counter performance Avg. ʻAʻole pono e ʻoi aku ma mua o 50 milliseconds.

      ʻO Zabbix: perf_counter[LogicalDisk(_Total)Avg. Disk sec/Read], a he mea nui nō hoʻi e mālama pono i ka disk i makemake ʻia, e like me kēia: perf_counter[LogicalDisk(C:)Avg. Disk sec/Heluhelu]

      Nā laʻana hoʻāla:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg. Disk sec/Read].last()}>0.005, level-high
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg. Disk sec/Read].last()}>0.0025, level-medium

    2. Awg Disc sec/Kākau
      Hōʻike i ka manawa maʻamau, i hōʻike ʻia i kekona, no ke kākau ʻana i ka ʻikepili i ka disk. Awelika kumu kūʻai hoʻokō hana. ʻAʻole pono e ʻoi aku ma mua o 10 milliseconds kekona. Waiwai kiʻekiʻe loa o ka counter performance Avg. ʻAʻole pono e ʻoi aku ma mua o 50 milliseconds.

      ʻO Zabbix: perf_counter[LogicalDisk(_Total)Avg. Disk sec/Write], a he mea nui nō hoʻi e mālama pono i ka disk i makemake ʻia, e like me kēia: perf_counter[LogicalDisk(C:)Avg. Disk sec/Kākau]

      Nā laʻana hoʻāla:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg. Disk sec/Write].last()}>0.005, pae kiʻekiʻe
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Avg. Disk sec/Kākau].last()}>0.0025, level-medium

    3. Ka lōʻihi o ka Pila Disk

      Ka lōʻihi o ka pila maʻamau o nā noi i ka diski. Hōʻike i ka helu o nā noi diski e kali ana i ka hana ʻana i loko o kahi manawa kikoʻī. ʻAʻole i ʻoi aku ka nui ma mua o 2 no ka disk hoʻokahi. Inā ʻoi aku ma mua o ʻelua mau noi i loko o ka pila, a laila hiki ke hoʻonui ʻia ka disk a ʻaʻole hiki ke hoʻoponopono i nā noi e hiki mai ana. Hiki iā ʻoe ke ʻike pono i nā hana ʻaʻole hiki i ka disk ke mālama me ka hoʻohana ʻana i nā helu Avg. Ka lōʻihi o ka helu helu helu disk a me ka Avg. Ka lōʻihi o ka Pīkia Wright (queue o nā noi kākau).
      Waiwai maʻamau ʻAʻole ana ʻia ka lōʻihi ʻo Disk Queue Length, akā helu ʻia me ke kānāwai ʻo Little mai ka manaʻo makemakika o ka queuing. Wahi a kēia kānāwai, ʻo ka nui o nā noi e kali nei e hoʻoponopono ʻia, ma ka awelika, e like me ka pinepine o nā noi i hoʻonui ʻia e ka manawa hana noi. ʻO kēlā mau mea. i kā mākou hihia Avg. Length Queue Disk = (Nā Hoʻololi Disk/sec) * (Avg. Disk sec/Transfer).

      Avg. Hāʻawi ʻia ʻo Disk Queue Length ma ke ʻano he helu nui no ka hoʻoholo ʻana i ka ukana ma ka subsystem disk, akā naʻe, no ka loiloi pono ʻana, pono e hōʻike pololei i ke ʻano kino o ka ʻōnaehana mālama. No ka laʻana, no ka paʻa paʻa hoʻokahi, ua manaʻo ʻia ka waiwai nui ma mua o 2, a inā aia ka disk ma kahi RAID array o 4 disks, a laila pono ʻoe e hopohopo inā ʻoi aku ka waiwai ma mua o 4*2=8.

      ʻO Zabbix: perf_counter[LogicalDisk(_Total)Avg. Ka lōʻihi o ka Disk Queue], a he mea nui nō hoʻi e mālama pono i ka disk i makemake ʻia, e like me kēia: perf_counter[LogicalDisk(C:)Avg. Ka lōʻihi o ka Pila Disk]

  2. hoomanao ana
    1. Nā ʻaoʻao/sec
      Hōʻike i ka helu o nā ʻaoʻao i heluhelu ʻia e SQL Server mai ka disk a i kākau ʻia paha i ka disk e hoʻoholo ai i ke komo ʻana i nā ʻaoʻao hoʻomanaʻo ʻaʻole i hoʻouka ʻia i loko o ka RAM i ka manawa o ke komo ʻana. ʻO kēia waiwai ka huina o Pages Input/sec a me Pages Output/sec, a noʻonoʻo pū i ka paging (paging/swaping) o ka ʻōnaehana huna no ke komo ʻana i nā faila ʻikepili noi. Eia kekahi, pili kēia i ka paging o nā faila i hoʻopaʻa ʻole ʻia i hoʻopaʻa ʻia i loko o ka hoʻomanaʻo. ʻO kēia ka papa helu nui e nānā ʻia inā ʻoe e ʻike nei i ka hoʻohana ʻana i ka hoʻomanaʻo kiʻekiʻe a me ka pili ʻana i ka paging nui. Hōʻike kēia counter i ka nui o ka hoʻololi ʻana a ʻo kona waiwai maʻamau (ʻaʻole kiʻekiʻe) pono kokoke i ka ʻole. ʻO ka hoʻonui ʻana i ka swapping e hōʻike ana i ka pono e hoʻonui i ka RAM a i ʻole e hōʻemi i ka helu o nā polokalamu noi e holo ana ma ke kikowaena.

      ʻO Zabbix: perf_counter[MemoryPages/sec] Ke kumu hoʻohālike:
      {NODE_NAME:perf_counter[MemoryPages/sec].min(5m)}>1000, ʻike pae

    2. ʻAoʻao hewa/sec

      ʻO kēia ka helu kuhi hewa ʻaoʻao. Loaʻa ka hewa ʻaoʻao ke kuhikuhi ʻia kahi kaʻina hana i kahi ʻaoʻao hoʻomanaʻo virtual ʻaʻole i loko o ka pūʻulu hana o RAM. E noʻonoʻo ana kēia counter i kēlā mau hewa ʻaoʻao e pono ai ke komo ʻana i ka disk, a me nā mea i hoʻokumu ʻia e ka ʻaoʻao ma waho o ka hana i hoʻonohonoho ʻia ma RAM. Hiki i ka hapa nui o nā kaʻina hana ke mālama i nā hewa ʻaoʻao Type XNUMX me ka ʻole o ka lohi. Eia nō naʻe, hiki i ka lawelawe ʻana i nā hewa ʻaoʻao ʻano XNUMX e koi ana i ke komo disk hiki ke hoʻopaneʻe nui.

      ʻO Zabbix: perf_counter[MemoryPage Faults/sec] Ke kumu hoʻohālike:
      {NODE_NAME:perf_counter[MemoryPage Faults/sec].min(5m)}>1000, ʻike pae

    3. Loaʻa Bytes

      Mālama i ka nui o ka hoʻomanaʻo i loaʻa i nā bytes no nā kaʻina hana like ʻole e holo. Hōʻike nā heluhelu haʻahaʻa i ka hoʻomanaʻo haʻahaʻa. ʻO ka hoʻonā e hoʻonui i ka hoʻomanaʻo. Pono kēia mika i ka nui o nā hihia ma mua o 5000 kV.
      Maikaʻi ke kau ʻana i ka paepae no nā Mbytes i loaʻa me ka lima no nā kumu penei:

      •50% ka hoʻomanaʻo manuahi i loaʻa = Maikaʻi
      •25% loaʻa ka hoʻomanaʻo = Pono ka nānā
      •10% manuahi = Pilikia paha
      Ma lalo o 5% memo i loaʻa = Koʻikoʻi no ka wikiwiki, pono ʻoe e komo.
      ʻO Zabbix: perf_counter[MemoryAvailable Bytes]

  3. Mea Hana (Ka huina): % Manawa o ka Mea Hana
    Hōʻike kēia helu helu i ka pākēneka o ka manawa a ka mea hana e hoʻokō ai i nā hana no nā pae ʻole. Hiki ke noʻonoʻo ʻia kēia waiwai e like me ka hapa o ka manawa i hoʻohana ʻia i ka hana pono. Hiki ke hāʻawi ʻia kēlā me kēia kaʻina hana i kahi kaula idle, kahi e hoʻopau ai i nā pōʻai hana ʻole i hoʻohana ʻole ʻia e nā kaula ʻē aʻe. Hōʻike ʻia kēia counter e nā piko pōkole hiki ke hiki i ka 100 pakeneka. Eia nō naʻe, inā he mau manawa lōʻihi kahi i ʻoi aku ai ka hoʻohana ʻana o ka mea hoʻohana ma luna o 80 pakeneka, a laila e ʻoi aku ka maikaʻi o ka ʻōnaehana me ka hoʻohana ʻana i nā kaʻina hana.

    ʻO Zabbix: perf_counter[Processor(_Total)% Processor Time], maanei hiki ke hōʻike ʻia e ke kumu.
    Ke kumu hoʻohālike:
    {NODE_NAME:perf_counter[Processor(_Total)% Processor Time].min(5m)}>80, level-information

  4. ʻIkepili Pūnaewele (*): % Bytes Total/sec
    ʻO ka huina o nā bytes i hoʻouna ʻia a loaʻa i kēlā me kēia kekona ma nā ʻaoʻao āpau. ʻO kēia ka bandwidth interface (ma nā bytes). Pono e hoʻohālikelike i ka waiwai o kēia counter me ka bandwidth kiʻekiʻe o ke kāleka pūnaewele. Ma keʻano laulā, pono e hōʻike kēia counter ma mua o 50% o ka hoʻohana ʻana i ka bandwidth adapter network.
    ʻO Zabbix: perf_counter[Inoa Pūnaewele(*)Bytes i hoʻouna ʻia/sec]
  5. MS SQL Server: Nā Hana Hana
    Hāʻawi ka mea Access Methods ma SQL Server i nā helu helu e kōkua i ka nānā ʻana i ka ʻike i ka ʻikepili loiloi i loko o kahi waihona. Hoʻohana ʻia ka ʻike kino i nā ʻaoʻao waihona ma ka disk me ka hoʻohana ʻana i nā helu hoʻokele buffer. ʻO ka nānā ʻana i nā ʻano ʻike ʻikepili i loko o ka waihona e kōkua i ka hoʻoholo ʻana inā hiki ke hoʻomaikaʻi ʻia ka hana nīnau ma ka hoʻohui ʻana a i ʻole ka hoʻololi ʻana i nā kuhikuhi, hoʻohui a hoʻoneʻe paha i nā ʻāpana, hoʻohui i nā faila a i ʻole nā ​​pūʻulu o nā faila, defragmenting index, a i ʻole ka hoʻololi ʻana i nā kikokikona nīnau. Eia hou, hiki iā ʻoe ke hoʻohana i nā mea helu ʻo Access Methods no ka nānā ʻana i ka nui o ka ʻikepili, nā kuhikuhi, a me ka hakahaka manuahi i kāu waihona, ka nānā ʻana i ka hiki a me ka ʻāpana no kēlā me kēia kikowaena kikowaena. Hiki ke ho'emi nui ka ho'oemi 'ana i ka hana.

    1. Māhele ʻAoʻao/sec
      ʻO ka helu o nā ʻāpana ʻaoʻao i kēlā me kēia kekona i hana ʻia ma muli o ke kahe ʻana o ka ʻaoʻao kuhikuhi. ʻO ka waiwai kiʻekiʻe no kēia metric, ʻo ia hoʻi, i ka wā e hana ai i nā hana hoʻokomo a hoʻohou i ka ʻikepili, pono e hana ʻo SQL Server i kahi helu nui o nā hana koʻikoʻi waiwai e hoʻokaʻawale i nā ʻaoʻao a hoʻoneʻe i kahi ʻaoʻao o kahi ʻaoʻao i kahi wahi hou. Pono e pale ia ia mau hana ke hiki. Hiki iā ʻoe ke hoʻāʻo e hoʻoponopono i ka pilikia ma nā ala ʻelua:
      - e hana i ka papa kuhikuhi no ka hoʻonui ʻana i nā kolamu. I kēia hihia, ʻaʻole e waiho ʻia nā moʻolelo hou i loko o nā ʻaoʻao i noho mua ʻia e ka ʻikepili, akā e hoʻopaʻa ʻia i nā ʻaoʻao hou;
      - kūkulu hou i nā kuhikuhi ma ka hoʻonui ʻana i ka waiwai o ka hoʻohālikelike Fillfactor. Hāʻawi kēia koho iā ʻoe e mālama i kahi kaʻawale i nā ʻaoʻao kuhikuhi e hoʻohana ʻia e hoʻokipa i nā ʻikepili hou, me ka ʻole o ka pono o nā hana hoʻokaʻawale ʻaoʻao.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Ka Hoʻokomo ʻana i nā ʻaoʻao ʻāpana/sec",30] Ke kumu hoʻohālike: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Kaʻana i nā ʻaoʻao ʻāpana/sekona",30]. hope()}>{NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsBatch Noi/sec",30].last()} /5, pae-ʻike
    2. Nānā piha/sec
      He helu palena ʻole o nā scan piha i kēlā me kēia kekona. Loaʻa kēia mau hana i ka nānā ʻana i ka papaʻaina nui a me ka scan index piha. Hiki i ka hoʻonui paʻa ʻana o kēia hōʻailona ke hōʻike i ka hoʻohaʻahaʻa ʻana o ka ʻōnaehana (ka nele o nā indexes pono, ko lākou ʻāpana koʻikoʻi, ka hiki ʻole o ka optimizer ke hoʻohana i nā kuhikuhi i loaʻa, ka loaʻa ʻana o nā kuhikuhi i hoʻohana ʻole ʻia). Eia naʻe, pono e hoʻomaopopo ʻia ʻaʻole hewa mau ka scan piha i nā papa liʻiliʻi, no ka mea inā hiki iā ʻoe ke kau i ka papaʻaina holoʻokoʻa i RAM, a laila e wikiwiki ka scan piha. Akā i ka hapanui o nā hihia, ʻo ka hoʻonui paʻa ʻana i kēia counter e hōʻike i ka degradation o ka ʻōnaehana. Pili kēia mau mea no nā ʻōnaehana OLTP wale nō. I nā ʻōnaehana OLAP, he mea maʻamau nā scan piha mau.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Nā Hana Loaʻa Nā Kiʻi piha/sec",30]

  6. MS SQL Server: Luna Hoʻokele
    Hāʻawi ka mea Buffer Manager i nā helu helu e kōkua iā ʻoe e nānā i ka hoʻohana ʻana o SQL Server i kēia mau kumuwaiwai:
    - hoʻomanaʻo no ka mālama ʻana i nā ʻaoʻao ʻikepili;
    - nā helu helu e nānā ana i ka I/O kino i ka heluhelu ʻana a kākau ʻana o SQL Server i nā ʻaoʻao waihona;
    - ka hoʻonui ʻana i ka loko wai e hoʻonui i ka cache buffer me ka hoʻohana ʻana i ka hoʻomanaʻo wikiwiki ʻole, e like me ka solid state drives (SSD);
    - ʻO ka nānā ʻana i ka hoʻomanaʻo a me nā helu helu i hoʻohana ʻia e SQL Server e kōkua i ka loaʻa ʻana o kēia ʻike;
    - inā he mau bottlenecks ma muli o ka nele o ka hoʻomanaʻo kino. Inā ʻaʻole hiki ke mālama ʻia ka ʻikepili i loaʻa pinepine ʻia i loko o ka cache, koi ʻia ʻo SQL Server e heluhelu mai ia diski;
    Hiki paha ke hoʻomaikaʻi i ka hana noiʻi ma o ka hoʻonui ʻana i ka nui o ka hoʻomanaʻo a i ʻole ka hoʻokaʻawale ʻana i ka hoʻomanaʻo hou i ka ʻikepili huna a mālama paha i nā hale SQL Server kūloko?
    — pehea ka heluhelu pinepine ʻana o SQL Server i ka ʻikepili mai ka disk. Hoʻohālikelike ʻia me nā hana ʻē aʻe e like me ke komo ʻana i ka hoʻomanaʻo, ʻoi aku ka lōʻihi o ka I/O kino e hoʻopau. Hiki ke ho'ēmi i ka I/O i ka hana nīnau.

    1. ʻO ka lekiō ʻo Buffer Cache
      Hōʻike i ka nui o ka ʻikepili SQL Server e hiki ke hoʻokomo i loko o ka pale huna. ʻO ke kiʻekiʻe o kēia waiwai, ʻoi aku ka maikaʻi, no ka mea I mea e komo pono ai ka SQL Server i nā ʻaoʻao ʻikepili, pono lākou i loko o kahi pale huna, a ʻaʻohe hana hoʻokomo kino/puka (I/O). Inā ʻike ʻoe i ka emi mau ʻana o ka waiwai maʻamau o kēia counter, pono ʻoe e noʻonoʻo e hoʻohui i ka RAM. Pono kēia hōʻailona ma luna o 90% no nā ʻōnaehana OLTP a ma luna o 50% no nā ʻōnaehana OLAP.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30] Nā laʻana hoʻāla: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30]. hope()}<70, pae kiʻekiʻe
      и
      {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30]. hope()}<80, level-medium
    2. ʻAoʻao manaʻolana ola
      Hōʻike i ka lōʻihi o ka hoʻomanaʻo ʻana o ka ʻaoʻao i kona kūlana o kēia manawa. Inā hāʻule mau ka waiwai, ʻo ia hoʻi, ke hana ʻino nei ka ʻōnaehana i ka wai buffer. No laila, hiki i ka hana hoʻomanaʻo ke hoʻopilikia i ka hopena o ka hana maikaʻi ʻole. He mea pono e hoʻomaopopo ʻaʻohe mea hōʻike honua ma lalo e hiki ai i kekahi ke hoʻoholo pololei i ka hoʻomāinoino ʻana o ka ʻōnaehana i ka wai buffer (ua pau ka hōʻailona o 300 kekona mai ka MS SQL Server 2012).
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage mana ola",30] Ke kumu hoʻohālike: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage life expectancy",30].last()}<5, level-information

  7. MS SQL Server: Heluhelu Nui
    Hāʻawi ka General Statistics object i SQL Server i nā helu helu e hiki ai iā ʻoe ke nānā i ka hana kikowaena holoʻokoʻa, e like me ka helu o nā pilina like ʻole a me ka helu o nā mea hoʻohana i kēlā me kēia kekona e hoʻopili ana a wehe paha mai ke kamepiula e holo ana i ka laʻana o SQL Server. Pono kēia mau metric i nā ʻōnaehana hoʻoili kālepa pūnaewele nui (OLTP) kahi e hoʻopili mau ai ka nui o nā mea kūʻai aku a wehe ʻia mai kahi manawa o SQL Server.

    1. Ua ālai ʻia ke kaʻina hana
      Ka helu o nā kaʻina hana i pāpā ʻia i kēia manawa.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Hoʻopaʻa ʻia nā Kaʻina Helu Nui",30] Ke kumu hoʻohālike: ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Paʻa ʻia nā Kaʻina Hana Helu Nui",30]. min(2m,0)}>=0)
      a ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Paʻa ʻia nā Kaʻina Hana Helu Nui",30]. manawa(0)}>=50000)
      a ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses i ālaiʻia",30].time(0)}<=230000), pae ʻike (eia ka palena hōʻailona mai 05:00 a 23:00)
    2. Hoʻohui mea hoʻohana
      ʻO ka helu o nā mea hoʻohana i pili i kēia manawa i SQL Server.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Nā Hoʻohui Mea Hoʻohana Nui",30]

  8. MS SQL Server: Nā laka
    Hāʻawi ka mea Locks ma Microsoft SQL Server i ka ʻike e pili ana i nā laka SQL Server i loaʻa no nā ʻano kumuwaiwai pākahi. Hoʻopuka ʻia nā laka ma nā kumuwaiwai SQL Server, e like me nā lālani i heluhelu ʻia a hoʻololi ʻia paha e kahi kālepa, e pale i nā hana he nui mai ka hoʻohana ʻana i ka kumuwaiwai i ka manawa like. No ka laʻana, inā loaʻa kahi laka kūʻokoʻa (X) e kahi kālepa ma kahi lālani i ka papaʻaina, ʻaʻohe hana ʻē aʻe e hiki ke hoʻololi i kēlā lālani a hiki i ka wehe ʻana o ka laka. ʻO ka hoʻemi ʻana i ka hoʻohana ʻana i nā laka e hoʻonui i ka concurrency, hiki ke hoʻomaikaʻi i ka hana holoʻokoʻa. Hiki ke hoʻopaʻa ʻia kekahi mau manawa o ka mea Locks i ka manawa like, e hōʻike ana kēlā me kēia i kahi laka ma kahi ʻano kumu waiwai.

    1. Manawa Kakali maʻamau (ms)
      ʻO ka lōʻihi o ke kali ʻana (i nā milliseconds) no nā noi laka a pau e pono ai ke kali. Hōʻike kēia helu helu i ka lōʻihi, ma ka awelika, e kali nā kaʻina mea hoʻohana ma ka pila no ka loaʻa ʻana o kahi laka ma kahi kumuwaiwai. ʻO ka waiwai nui i ʻae ʻia o kēia counter e pili pono ana i kāu hana; he paʻakikī ke hoʻoholo i ka waiwai awelika no nā noi āpau. Inā kiʻekiʻe loa kēia counter, hiki iā ia ke kuhikuhi i nā pilikia laka i kāu waihona.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)We Kali Kali (ms)",30] Ke kumu hoʻohālike: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)W Kali Kali (ms)",30].last()}>=500, level-information
    2. Laka manawa kali (ms)
      Ka nui o ka manawa kali laka (i nā milliseconds) ma ke kekona hope loa.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Time Kali (ms)",30]
    3. Laka Kali/sec
      ʻO ka helu o nā manawa i ka kekona hope i kali ʻia ai kahi pae ma muli o kahi noi laka.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Kali/sec",30]
    4. Laka manawa pau/sec
      ʻO ka nui o nā manawa i hiki ʻole ke loaʻa ka laka e ka round robin. Hoʻoholo ka SQL Server spin counter configuration parameter value i ka helu o nā manawa e hiki ai i ke kaula ke wili ma mua o ka pau ʻana o ka manawa a lilo ke kaula i mea ʻole.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Loka(_Ka pau)Laka manawa pau/kekona",30] Ke kumu hoʻohālike: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Locks(_Total)Lock Timeouts/sec",30].last()}>1000, level-information
    5. Noi Laka/sec
      Ka helu o nā noi i kēlā me kēia kekona o ke ʻano laka i kuhikuhi ʻia.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Nīnau Laka/sec",30] Ke kumu hoʻohālike: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Nīnau Laka/sec",30].last()}>500000, level-information
    6. Laka Ka helu o nā mea make/sec
      ʻO ka helu o nā noi laka i kēlā me kēia kekona e hopena i kahi paʻa. ʻO ka loaʻa ʻana o nā deadlocks e hōʻike ana i nā nīnau i kūkulu maikaʻi ʻole ʻia e pale ana i nā kumuwaiwai kaʻana like.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Ka helu o nā Paʻa/sec",30] Ke kumu hoʻohālike: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Nui o nā Paʻa/sec",30].last()}>1, level-high

  9. MS SQL Server: Luna Hoʻomanaʻo
    Hāʻawi ka Mea Mana Mana Manaʻo ma Microsoft SQL Server i nā helu helu no ka nānā ʻana i ka hoʻohana ʻana i ka hoʻomanaʻo ākea ākea. ʻO ka nānā ʻana i ka hoʻohana ʻana i ka hoʻomanaʻo o ke kikowaena holoʻokoʻa e loiloi i ka hana a ka mea hoʻohana a me ka hoʻohana waiwai hiki ke kōkua i ka ʻike ʻana i nā bottlenecks hana. ʻO ka nānā ʻana i ka hoʻomanaʻo i hoʻohana ʻia e kahi laʻana o SQL Server hiki ke kōkua i ka hoʻoholo:
    - inā he hemahema o ka hoʻomanaʻo kino ʻole e mālama i ka ʻikepili i hoʻohana pinepine ʻia i loko o ka huna huna. Inā ʻaʻole lawa ka hoʻomanaʻo, pono e kiʻi ʻo SQL Server i ka ʻikepili mai ka disk;
    - Inā hiki ke hoʻomaikaʻi ka hana nīnau inā hoʻohui ʻia ka hoʻomanaʻo a i ʻole ka nui o ka hoʻomanaʻo i loaʻa no ka hoʻopaʻa ʻana i ka ʻikepili a i ʻole nā ​​hale SQL Server kūloko.

    1. Nā Haʻawina Hoʻomanaʻo Kūlana
      Hōʻike i ka huina o nā kaʻina hana i loaʻa maikaʻi ka hoʻomanaʻo wahi hana. Inā hāʻule mau ka hōʻailona, ​​​​pono e hoʻonui i ka RAM.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Memory ManagerMemory Hāʻawi Kūʻokoʻa",30]
    2. Hāʻawi Hoʻomanaʻo e kali ana
      Hōʻike i ka huina o nā kaʻina hana e kali ana e hoʻokaʻawale ʻia ka hoʻomanaʻo hana. Me ka ulu paʻa o ka hōʻailona, ​​​​pono e hoʻonui i ka RAM.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Memory ManagerMemory Haʻawina e kali ana",30]

  10. MS SQL Server: Heluhelu
    Hāʻawi ka Statistics object ma Microsoft SQL Server i nā helu helu e nānā i ka hui ʻana a me nā ʻano nīnau i hoʻouna ʻia i kahi laʻana o SQL Server. ʻO ka nānā ʻana i ka helu o nā hōʻuluʻulu nīnau a me ka hoʻohui hou ʻana a me ka helu o nā pūʻulu i loaʻa i kahi laʻana o SQL Server e hāʻawi i ka ʻike i ka wikiwiki o ka hoʻokō ʻana o SQL Server i nā nīnau a ka mea hoʻohana a me ka maikaʻi o ka hoʻoponopono ʻana i nā nīnau.

    1. Noi Puʻupuʻu/sec
      Ka helu o nā ʻeke kauoha Transact-SQL i loaʻa i kēlā me kēia kekona. Hoʻopili ʻia kēia mau ʻikepili e kekahi mau palena (I/O, ka helu o nā mea hoʻohana, ka nui o ka cache, ka paʻakikī o ka nīnau, etc.). Hōʻike ka helu kiʻekiʻe o nā noi packet i ka puka kiʻekiʻe.
      ʻO Zabbix: perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsBatch Noi/sec",30]

Ma waho aʻe o nā mea a pau i luna, hiki iā ʻoe ke hoʻonohonoho i nā mea ʻikepili ʻē aʻe (a me ka hana ʻana i nā mea hoʻoiho ma luna o lākou me nā hoʻolaha ma hope).
1) ka nui o ka hakahaka diski manuahi
2) ka nui o nā waihona ʻikepili waihona a me nā moʻolelo
a pēlā aku nō.
Eia naʻe, ʻaʻole hōʻike kēia mau hōʻailona i ka pilikia o nā nīnau manawa maoli.
No ka hana ʻana i kēia, pono ʻoe e hana i kāu mau helu kūikawā.
Ma muli o nā kumu hūnā, ʻaʻole au e hāʻawi i nā laʻana o ia mau helu helu. Eia kekahi, ua hoʻonohonoho kūʻokoʻa lākou no kēlā me kēia ʻōnaehana. Akā ʻike wau no nā ʻōnaehana e like me 1C, NAV a me CRM, hiki ke hana ʻia nā helu helu kūikawā me nā mea hoʻomohala kūpono.
E hāʻawi wau i kahi laʻana o ka hana ʻana i kahi hōʻailona ākea e hōʻike ana i ka nui o nā noi e holo nei a me ka nui o nā noi e kali nei (hoʻopaʻa ʻia a paʻa ʻia) i kēlā me kēia manawa.
No ka hana ʻana i kēia, pono ʻoe e hana i kahi kaʻina hana i mālama ʻia:
kuhi

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

A laila, pono ʻoe e hele i ka waihona kahi i loaʻa ai ʻo Zabbix (zabbixconfuserparams.d) a hana i nā faila 2 me ka extension ps1 (PowerShell) a kākau i kēia mau code i kēlā me kēia:
Code no ka holo ʻana i nā nīnau

$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;

Code no nā noi e kali nei

$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;

I kēia manawa pono ʻoe e hana i kahi faila me nā ʻāpana mea hoʻohana a me kahi hoʻonui .conf (a i ʻole e hoʻohui i nā laina i kahi faila mea hoʻohana e kū nei, inā i hana mua ʻia kekahi) a hoʻokomo i kēia mau laina:
UserParameter=PARAMETER_NAME_NUMBER_of_QUERIES HANA, powershell -NoProfile -ExecutionPolicy Bypass -File FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_EXECUTED_QUERYES.ps1
UserParameter=PARAMETER_NAME_NUMBER_WAITING_REQUESTS,powershell -NoProfile -ExecutionPolicy Bypass -File FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_WAITING_REQUESTS.ps1
Ma hope o kēia, e mālama i ka faila .conf a hoʻomaka hou i ka mea hana Zabbix.
Ma hope o kēia, hoʻohui mākou i ʻelua mau mea hou iā Zabbix (i kēia hihia, ua like nā inoa a me nā kī):
PARAMETER_NAME_NUMBER OF_NOI I HANAIA
PARAMETER_NAME_NUMBER OF_WAITING_REQUESTS
Hiki iā ʻoe ke hana i nā kiʻikuhi a me nā mea hoʻoulu no nā mea ʻikepili maʻamau.

Inā piʻi nui ka helu o nā noi e kali nei, a laila hiki i kēia nīnau ke hōʻike i nā noi holo a me nā noi e kali nei i ka manawa i hāʻawi ʻia me nā kikoʻī mai kahi a ma lalo o ke ʻano o ke komo ʻana i hoʻokō ʻia ai ka noi, ka kikokikona a me ka hoʻolālā nīnau, a me nā kikoʻī ʻē aʻe:
kuhi

/*Активные, готовые к выполнению и ожидающие запросы, а также те, что явно блокируют другие сеансы*/
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);

E hoʻomanaʻo pū wau iā ʻoe e like me nā helu i hōʻiliʻili ʻia hiki iā ʻoe ke loaʻa i nā nīnau paʻakikī loa:
kuhi

/*
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

Hiki iā ʻoe ke kākau no MySQL. No ka hana ʻana i kēia pono ʻoe e hoʻokomo mysql-hono-uena a laila kākau i ke code e like me kēia:
Code no nā noi e kali nei

#Задаем переменные для подключение к 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;

hopena

Ua nānā kēia ʻatikala i kahi laʻana o nā helu hana (nā mea ʻikepili) ma Zabbix. Hiki i kēia ala ke hoʻomaopopo i nā luna hoʻomalu e pili ana i nā pilikia like ʻole i ka manawa maoli a i ʻole ma hope o kekahi manawa kikoʻī. No laila, ʻae kēia ala iā mākou e hōʻemi i ka hiki ʻana mai o kahi pilikia koʻikoʻi i ka wā e hiki mai ana a hoʻōki i ka hana o ka DBMS a me ka server, ʻo ia ka mea e pale ai i ka hana mai ka hoʻōki ʻana i nā kaʻina hana.
ʻatikala mua: Hana maʻamau me ka ʻikepili ʻōnaehana ʻikepili 24 × 7 ma MS SQL Server

Nā kumuhana:

» ʻO Zabbix 3.4
» Nā helu hana
» Hale Hana Hana no ka Azure SQL Database a me SQL Server Database Engine
» Ka nohona SQL
» SQLSkills
» TechNet Microsoft
» Ke kālailai ʻana i ka hoʻohana ʻana i ka hoʻomanaʻo
» Nānā Hana Hana
» Palapala SQL
» Nā memo e pili ana iā Windows

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka