Uża Zabbix biex Tissorvelja MS SQL Server Database

Daħla

Ħafna drabi jkun hemm bżonn li tirrapporta lill-amministratur f'ħin reali dwar problemi relatati mad-database (database).

Dan l-artikolu se jiddeskrivi dak li jeħtieġ li jiġi kkonfigurat f'Zabbix biex jimmonitorja database MS SQL Server.

Jekk jogħġbok innota li d-dettalji dwar kif tikkonfigura mhux se jingħataw, madankollu, formuli u rakkomandazzjonijiet ġenerali, kif ukoll deskrizzjoni dettaljata taż-żieda ta 'elementi tad-dejta tad-dwana permezz ta' proċeduri maħżuna se jingħataw f'dan l-artikolu.
Ukoll, il-counters ewlenin tal-prestazzjoni biss se jiġu diskussi hawn.

deċiżjoni

L-ewwel, ser niddeskrivi dawk il-counters tal-prestazzjoni kollha (permezz ta 'elementi tad-dejta f'Zabbix) li għandna bżonn:

  1. Disk Loġiku
    1. Medja Diska sek/Aqra
      Juri l-ħin medju, espress f'sekondi, għall-qari tad-dejta mid-diska. Valur medju tal-counter tal-prestazzjoni medja. Disk sec/Read m'għandux jaqbeż l-10 millisekondi. Valur massimu tal-counter tal-prestazzjoni Avg. Disk sec/Read m'għandux jaqbeż il-50 millisekondi.

      Zabbix: perf_counter[LogicalDisk(_Total)Avg. Disk sec/Read], u huwa importanti wkoll li żżomm kont tad-disk mixtieq, pereżempju bħal dan: perf_counter[LogicalDisk(C:)Avg. Disk sec/Aqra]

      Tqajjem eżempji:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Med. Disk sec/Aqra]. l-aħħar ()}> 0.005, livell għoli
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Med. Disk sec/Read].last()}>0.0025, level-medium

    2. Medja Diska sek/Ikteb
      Juri l-ħin medju, espress f'sekondi, għall-kitba tad-dejta fuq id-diska. Valur medju tal-counter tal-prestazzjoni medja. Disk sec/Write m'għandux jaqbeż l-10 millisekondi. Valur massimu tal-counter tal-prestazzjoni Avg. Disk sec/Write m'għandux jaqbeż il-50 millisekondi.

      Zabbix: perf_counter[LogicalDisk(_Total)Avg. Disk sec/Write], u huwa wkoll importanti li żżomm kont tad-disk mixtieq, pereżempju bħal dan: perf_counter[LogicalDisk(C:)Avg. Disk sec/Ikteb]

      Tqajjem eżempji:
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Med. Disk sec/Write].last()}>0.005, livell għoli
      и
      {NODE_NAME:perf_counter[LogicalDisk(_Total)Med. Disk sec/Write].last()}>0.0025, level-medium

    3. Tul medju fil-kju tad-disk

      Tul medju tal-kju tat-talbiet lid-diska. Juri n-numru ta' talbiet għad-disk pendenti għall-ipproċessar f'intervall ta' żmien speċifikat. Kju ta' mhux aktar minn 2 għal disk wieħed huwa meqjus bħala normali. Jekk ikun hemm aktar minn żewġ talbiet fil-kju, allura d-disk jista 'jkun mgħobbi żżejjed u ma jistax jipproċessa talbiet deħlin. Tista 'ssir taf eżattament liema operazzjonijiet id-disk ma jistax jimmaniġġja bl-użu ta' Avg counters. Disk Read Queue Length u medja. Disk Wright Queue Length (kju ta' talbiet ta' kitba).
      Valur medju Disk Queue Length ma jitkejjel, iżda huwa kkalkulat bl-użu tal-liġi ta 'Little mit-teorija matematika ta' kju. Skont din il-liġi, in-numru ta’ talbiet li qed jistennew biex jiġu pproċessati huwa, bħala medja, ugwali għall-frekwenza tat-talbiet immultiplikat bil-ħin tal-ipproċessar tat-talbiet. Dawk. fil-każ tagħna Avg. Tul tal-Kju tad-Disk = (Trasferimenti tad-Disk/sek) * (Medja Disk sek/Trasferiment).

      Medja. Disk Queue Length jingħata bħala wieħed mill-counters prinċipali għad-determinazzjoni tat-tagħbija fuq is-subsistema tad-disk, madankollu, biex tiġi evalwata b'mod adegwat, huwa meħtieġ li tirrappreżenta b'mod preċiż l-istruttura fiżika tas-sistema tal-ħażna. Pereżempju, għal hard drive wieħed valur akbar minn 2 huwa meqjus bħala kritiku, u jekk id-diska tinsab fuq firxa RAID ta '4 diski, allura għandek tinkwieta jekk il-valur huwiex akbar minn 4 * 2 = 8.

      Zabbix: perf_counter[LogicalDisk(_Total)Avg. Disk Queue Length], u huwa importanti wkoll li żżomm rekord tad-disk mixtieq, pereżempju bħal dan: perf_counter[LogicalDisk(C:)Avg. Tul tal-kju tad-disk]

  2. Memorja
    1. Paġni/sek
      Juri n-numru ta' paġni li SQL Server qara mid-disk jew kiteb fuq id-disk biex isolvi l-aċċessi għall-paġni tal-memorja li ma kinux mgħobbija fir-RAM fil-ħin tal-aċċess. Dan il-valur huwa s-somma tal-Paġni Input/sec u l-Output tal-Paġni/sec, u jqis ukoll il-paging (paging/swaping) tal-cache tas-sistema għall-aċċess għall-fajls tad-dejta tal-applikazzjoni. Barra minn hekk, dan jinkludi paging ta 'fajls mhux fil-cache li huma mmappjati direttament fil-memorja. Dan huwa l-counter ewlieni li għandu jiġi mmonitorjat jekk qed tesperjenza użu għoli tal-memorja u paging eċċessiv assoċjat. Dan il-counter jikkaratterizza l-ammont ta 'skambju u l-valur normali tiegħu (mhux l-ogħla) għandu jkun qrib iż-żero. Żieda fl-iskambji tindika l-ħtieġa li tiżdied RAM jew jitnaqqas in-numru ta 'programmi ta' applikazzjoni li jaħdmu fuq is-server.

      Zabbix: perf_counter[MemoryPages/sec] Trigger eżempju:
      {NODE_NAME:perf_counter[MemoryPages/sec].min(5m)}>1000, level-information

    2. Ħsarat tal-Paġna/sek

      Dan huwa l-valur tal-kontatur tal-ħsara fil-paġna. Ħtija fil-paġna sseħħ meta proċess jirreferi għal paġna tal-memorja virtwali li mhix fis-sett tax-xogħol tar-RAM. Dan il-counter iqis kemm dawk il-ħsarat fil-paġna li jeħtieġu aċċess għad-diska, kif ukoll dawk li huma kkawżati mill-paġna li tkun barra mis-sett tax-xogħol fir-RAM. Ħafna mill-proċessuri jistgħu jimmaniġġjaw ħsarat fil-paġna tat-Tip XNUMX mingħajr ħafna dewmien. Madankollu, l-immaniġġjar ta' ħsarat fil-paġna tat-tip XNUMX li jeħtieġu aċċess għad-disk jista 'jikkawża dewmien sinifikanti.

      Zabbix: perf_counter[MemoryPage Faults/sec] Trigger eżempju:
      {NODE_NAME:perf_counter[MemoryPage Faults/sec].min(5m)}>1000, level-information

    3. Bytes Disponibbli

      Iżomm rekord ta 'l-ammont ta' memorja disponibbli f'bytes biex jitmexxew diversi proċessi. Qari baxx jindika memorja baxxa. Is-soluzzjoni hija li tiżdied il-memorja. Dan il-meter għandu f'ħafna każijiet ikun kontinwament 'il fuq minn 5000 kV.
      Jagħmel sens li jiġi stabbilit il-limitu għal Mbytes Disponibbli manwalment għar-raġunijiet li ġejjin:

      •50% memorja ħielsa disponibbli = Eċċellenti
      •25% memorja disponibbli = Jeħtieġ attenzjoni
      •10% b'xejn = Problemi possibbli
      •Inqas minn 5% memorja disponibbli = Kritika għall-veloċità, għandek bżonn tintervjeni.
      Zabbix: perf_counter[MemoryAvailable Bytes]

  3. Proċessur (Total): % Ħin tal-Proċessur
    Dan il-counter juri l-perċentwal tal-ħin li l-proċessur kien okkupat jwettaq operazzjonijiet għal ħjut mhux inattivi. Dan il-valur jista' jitqies bħala l-proporzjon tal-ħin mgħoddi biex tagħmel xogħol utli. Kull proċessur jista 'jiġi assenjat għal ħajt idle, li jikkonsma ċikli ta' proċessur mhux produttivi mhux użati minn ħjut oħra. Dan il-counter huwa kkaratterizzat minn qċaċet qosra li jistgħu jilħqu 100 fil-mija. Madankollu, jekk ikun hemm perjodi estiżi fejn l-utilizzazzjoni tal-proċessur hija 'l fuq minn 80 fil-mija, allura s-sistema tkun aktar effiċjenti billi tuża aktar proċessuri.

    Zabbix: perf_counter[Processor(_Total)% Processor Time], hawnhekk jista' jintwera wkoll bil-qalba
    Trigger eżempju:
    {NODE_NAME:perf_counter[Processor(_Total)% Processor Time].min(5m)}>80, level-information

  4. Netwerk Interface (*): % Bytes Total/sek
    In-numru totali ta' bytes mibgħuta u riċevuti kull sekonda fl-interfaces kollha. Din hija l-bandwidth ta' l-interface (f'bytes). Huwa meħtieġ li jitqabbel il-valur ta 'dan il-counter mal-bandwidth massimu tal-karta tan-netwerk. B'mod ġenerali, dan il-counter għandu juri mhux aktar minn 50% utilizzazzjoni tal-bandwidth tal-adapter tan-netwerk.
    Zabbix: perf_counter[Network Interface(*)Bytes Mibgħuta/sec]
  5. MS SQL Server: Metodi ta' Aċċess
    L-oġġett tal-Metodi ta' Aċċess f'SQL Server jipprovdi counters biex jgħinu jsegwu l-aċċess għal data loġika f'database. L-aċċess fiżiku għall-paġni tad-database fuq id-diska huwa kkontrollat ​​bl-użu ta' buffer manager counters. Il-monitoraġġ tal-metodi ta 'aċċess għad-dejta fid-database jgħin biex jiddetermina jekk il-prestazzjoni tal-mistoqsija tistax titjieb billi żżid jew tbiddel l-indiċi, iż-żieda jew iċ-ċaqliq ta' diviżorji, iż-żieda ta 'fajls jew gruppi ta' fajls, id-deframmentazzjoni tal-indiċi, jew it-tibdil tat-test tal-mistoqsija. Barra minn hekk, tista 'tuża l-bankijiet tal-oġġetti tal-Metodi ta' Aċċess biex tissorvelja d-daqs tad-dejta, l-indiċi u l-ispazju ħieles fid-database tiegħek, il-kapaċità ta 'monitoraġġ u l-frammentazzjoni għal kull istanza ta' server. Frammentazzjoni eċċessiva tal-indiċi tista' tnaqqas il-prestazzjoni b'mod sinifikanti.

    1. Qsim ta' Paġni/sek
      In-numru ta' qsim tal-paġna kull sekonda mwettqa bħala riżultat ta' overflow tal-paġna tal-indiċi. Valur għoli għal din il-metrika jfisser li meta twettaq operazzjonijiet ta 'inserzjoni u aġġornament fuq id-dejta, SQL Server għandu jwettaq numru kbir ta' operazzjonijiet li jużaw ħafna riżorsi biex jaqsam paġni u jċaqlaq parti minn paġna eżistenti għal post ġdid. Operazzjonijiet bħal dawn għandhom jiġu evitati kull meta jkun possibbli. Tista' tipprova ssolvi l-problema b'żewġ modi:
      — oħloq indiċi raggruppat għall-kolonni awto-inkrementali. F'dan il-każ, rekords ġodda mhux se jitqiegħdu ġewwa paġni diġà okkupati mid-dejta, iżda se jokkupaw paġni ġodda b'mod sekwenzjali;
      — jerġgħu jinbnew l-indiċi billi jiżdied il-valur tal-parametru Fillfactor. Din l-għażla tippermettilek li tirriżerva spazju ħieles f'paġni tal-indiċi li se jintużaw biex takkomodaw dejta ġdida, mingħajr il-ħtieġa għal operazzjonijiet ta 'qsim tal-paġna.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Metodi ta' AċċessPage Splits/sec",30] Trigger eżempju: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Aċċess MethodsPage Splits/sec",30].last()}>{NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsBatch Requests/sec",30].last()} /5, livell-informazzjoni
    2. Skans Sħiħ/sek
      Numru illimitat ta 'skanijiet sħaħ kull sekonda. Dawn l-operazzjonijiet jinkludu skans tal-mejda prinċipali u skans tal-indiċi sħaħ. Żieda stabbli f'dan l-indikatur tista 'tindika degradazzjoni tas-sistema (nuqqas ta' indiċijiet meħtieġa, frammentazzjoni severa tagħhom, nuqqas ta 'l-ottimizzatur li juża indiċijiet eżistenti, preżenza ta' indiċijiet mhux użati). Madankollu, ta 'min jinnota li skan sħiħ f'tabelli żgħar mhux dejjem huwa ħażin, għaliex jekk tista' tpoġġi t-tabella kollha fir-RAM, allura skan sħiħ ikun aktar mgħaġġel. Iżda f'ħafna każijiet, żieda stabbli f'dan il-counter tindika degradazzjoni tas-sistema. Dan kollu huwa applikabbli biss għal sistemi OLTP. Fis-sistemi OLAP, skans sħaħ kostanti huma normali.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Metodi ta' AċċessSkans Sħiħ/sek",30]

  6. MS SQL Server: Buffer Manager
    L-oġġett Buffer Manager jipprovdi counters li jgħinuk tissorvelja kif SQL Server juża r-riżorsi li ġejjin:
    — memorja għall-ħażna ta' paġni tad-dejta;
    - counters li jimmonitorjaw I/O fiżiku hekk kif SQL Server jaqra u jikteb paġni tad-database;
    — espansjoni tal-buffer pool biex tespandi l-buffer cache bl-użu ta’ memorja veloċi mhux volatili, bħal solid state drives (SSD);
    - Il-memorja tal-monitoraġġ u l-counters użati minn SQL Server jgħin biex tinkiseb l-informazzjoni li ġejja;
    — jekk hemmx konġestjonijiet ikkawżati minn nuqqas ta' memorja fiżika. Jekk data aċċessata ta 'spiss ma tistax tinħażen fil-cache, SQL Server huwa sfurzat jaqraha mid-disk;
    Huwa possibbli li tittejjeb il-prestazzjoni tal-mistoqsijiet billi żżid l-ammont ta 'memorja jew talloka memorja addizzjonali għal data cache jew taħżen strutturi interni SQL Server?
    — kemm-il darba SQL Server jaqra data mid-disk. Meta mqabbel ma 'operazzjonijiet oħra bħall-aċċess għall-memorja, I/O fiżiku jieħu aktar żmien biex jitlesta. It-tnaqqis tal-I/O jista’ jtejjeb il-prestazzjoni tal-mistoqsija.

    1. Buffer Cache hit radju
      Tindika kemm SQL Server jista' jidħol fid-data fil-cache buffer. Iktar ma jkun għoli dan il-valur, l-aħjar, għaliex Biex SQL Server jaċċessa b'mod effettiv il-paġni tad-dejta, iridu jkunu f'cache buffer, u m'għandux ikun hemm operazzjonijiet fiżiċi ta 'input/output (I/O). Jekk tara tnaqqis kostanti fil-valur medju ta 'dan il-counter, għandek tikkunsidra li żżid RAM. Dan l-indikatur għandu dejjem ikun 'il fuq minn 90% għas-sistemi OLTP u 'l fuq minn 50% għas-sistemi OLAP.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30] Tqajjem eżempji: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30].last()}<70, livell għoli
      и
      {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cache hit ratio",30].last()}<80, level-medium
    2. L-istennija tal-ħajja tal-paġna
      Juri kemm il-paġna se tibqa' fil-memorja b'mod permanenti fl-istat attwali tagħha. Jekk il-valur jibqa' jonqos, dan ifisser li s-sistema qed tabbuża mill-buffer pool. Għalhekk, il-prestazzjoni tal-memorja tista 'potenzjalment tikkawża problemi li jirriżultaw f'prestazzjoni fqira. Ta’ min jinnota li m’hemm l-ebda indikatur universali li taħtu wieħed jista’ jiġġudika b’mod ċar li s-sistema qed tabbuża mill-buffer pool (l-indikatur ta’ 300 sekonda ilu skadut minn MS SQL Server 2012).
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage stennija tal-ħajja",30] Trigger eżempju: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage stennija tal-ħajja",30].last()}<5, level-information

  7. MS SQL Server: Statistika Ġenerali
    L-oġġett tal-Istatistika Ġenerali f'SQL Server jipprovdi counters li jippermettulek tissorvelja l-attività ġenerali tas-server, bħan-numru ta 'konnessjonijiet konkorrenti u n-numru ta' utenti kull sekonda li jgħaqqdu jew jiskonnettjaw mill-kompjuter li jmexxi l-istanza ta 'SQL Server. Dawn il-metriċi huma utli f'sistemi kbar ta' pproċessar ta' tranżazzjonijiet onlajn (OLTP) fejn numru kbir ta' klijenti qegħdin kontinwament jgħaqqdu u jiskonnettjaw minn eżempju ta' SQL Server.

    1. Proċess imblukkat
      In-numru ta 'proċessi attwalment imblukkati.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Proċessi ta' Statistika Ġenerali mblukkati",30] Trigger eżempju: ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Proċessi ta' Statistika Ġenerali mblukkati",30].min(2m,0)}>=0)
      u ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Proċessi ta' Statistika Ġenerali mblukkati",30].time(0)}>=50000)
      u ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:General StatisticsProcesses blocked",30].time(0)}<=230000), livell ta' informazzjoni (hawnhekk hemm restrizzjoni ta' sinjalazzjoni mill-05:00 sat-23:00)
    2. Konnessjonijiet tal-Utenti
      In-numru ta' utenti li bħalissa huma konnessi ma' SQL Server.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Statistika Ġenerali Konnessjonijiet tal-Utenti",30]

  8. MS SQL Server: Serraturi
    L-oġġett Locks f'Microsoft SQL Server jipprovdi informazzjoni dwar serraturi SQL Server akkwistati għal tipi ta' riżorsi individwali. Serraturi jinħarġu fuq riżorsi SQL Server, bħal ringieli jinqraw jew modifikati minn tranżazzjoni, biex jipprevjenu transazzjonijiet multipli milli jużaw ir-riżors fl-istess ħin. Pereżempju, jekk lock esklussiv (X) jiġi akkwistat minn tranżazzjoni fuq ringiela f'tabella, l-ebda transazzjoni oħra ma tista' tbiddel dik ir-ringiela sakemm is-serratura tiġi rilaxxata. Il-minimizzazzjoni tal-użu ta 'serraturi żżid il-konkorrenza, li tista' ttejjeb il-prestazzjoni ġenerali. Diversi każijiet tal-oġġett Locks jistgħu jiġu ssorveljati fl-istess ħin, li kull wieħed minnhom jirrappreżenta lock fuq tip separat ta 'riżorsa.

    1. Ħin medju ta' Stennija (ms)
      It-tul medju ta' stennija (f'millisekondi) għat-talbiet kollha ta' lock li kienu jeħtieġu stennija. Dan il-counter juri kemm, bħala medja, il-proċessi tal-utenti jridu jistennew fil-kju biex jiksbu lock fuq riżors. Il-valur massimu permissibbli ta 'dan il-counter jiddependi kompletament fuq il-kompitu tiegħek; huwa diffiċli li tiddetermina kwalunkwe valur medju għall-applikazzjonijiet kollha. Jekk dan il-counter huwa għoli wisq, jista' jindika problemi ta' qfil fid-database tiegħek.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Ħin Medji ta' Stennija (ms)",30] Trigger eżempju: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Medju ta' Wait Time (ms)",30].last()}>=500, level-information
    2. Ħin ta' Stennija tal-Lock (ms)
      Ħin totali ta' stennija tal-lock (f'millisekondi) matul l-aħħar sekonda.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Wait Time (ms)",30]
    3. Lock Waits/sek
      In-numru ta' drabi fl-aħħar sekonda li ħajta kellha tistenna minħabba talba ta' lock.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Waits/sec",30]
    4. Lock Timeouts/sek
      In-numru ta' drabi li l-lock ma jistax jiġi akkwistat minn round robin. Il-valur tal-parametru tal-konfigurazzjoni tal-konfigurazzjoni tal-ispin counter ta' SQL Server jiddetermina n-numru ta' drabi li ħajta tista' ddur qabel ma tispiċċa u l-ħajta ssir inattiva.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Timeouts/sec",30] Trigger eżempju: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Locks(_Total)Lock Timeouts/sec",30].last()}>1000, level-information
    5. Talbiet tal-lock/sek
      In-numru ta' talbiet kull sekonda tat-tip ta' serratura speċifikat.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Requests/sec",30] Trigger eżempju: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Lock Requests/sec",30].last()}>500000, level-information
    6. Lock Numru ta' Deadlocks/sek
      In-numru ta' talbiet għal lock kull sekonda li jirriżultaw f'imblokk. Il-preżenza ta' deadlocks tindika mistoqsijiet mibnija ħażin li qed jimblukkaw ir-riżorsi kondiviżi.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Numru ta' Deadlocks/sek",30] Trigger eżempju: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Locks(_Total)Numru ta' Deadlocks/sec",30].last()}>1, livell għoli

  9. MS SQL Server: Maniġer tal-Memorja
    L-oġġett tal-Maniġer tal-Memorja f'Microsoft SQL Server jipprovdi counters biex jimmonitorja l-użu tal-memorja fis-server kollu. Il-monitoraġġ tal-użu tal-memorja tas-server kollu biex jevalwa l-attività tal-utent u l-użu tar-riżorsi jista 'jgħin biex jiġu identifikati xkiel fil-prestazzjoni. Il-monitoraġġ tal-memorja użat minn eżempju ta 'SQL Server jista' jgħin biex jiddetermina:
    — jekk hemmx nuqqasijiet ta' memorja fiżika insuffiċjenti biex tinħażen data użata ta' spiss fil-cache. Jekk ma jkunx hemm biżżejjed memorja, SQL Server għandu jġib id-data mid-disk;
    - Jekk il-prestazzjoni tal-mistoqsija setgħetx titjieb jekk il-memorja kienet miżjuda jew l-ammont ta 'memorja disponibbli għall-caching tad-data jew strutturi interni SQL Server żdied.

    1. Għotjiet tal-Memorja Pendenti
      Jindika n-numru totali ta' proċessi li kisbu b'suċċess memorja tal-ispazju tax-xogħol. Jekk l-indikatur jinżel b'mod kostanti, huwa meħtieġ li tiżdied ir-RAM.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Memory ManagerMemory Grants Pendenti",30]
    2. Għotjiet tal-Memorja Pendenti
      Jindika n-numru totali ta' proċessi li qed jistennew li jiġu allokati memorja ta' ħidma. Bi tkabbir stabbli ta 'l-indikatur, huwa meħtieġ li tiżdied RAM.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Memory ManagerMemory Grants Pending",30]

  10. MS SQL Server: Statistika
    L-oġġett Statistika fil-Microsoft SQL Server jipprovdi counters biex jimmonitorjaw il-kumpilazzjoni u t-tipi ta 'mistoqsijiet mibgħuta lil istanza ta' SQL Server. Il-monitoraġġ tan-numru ta' kumpilazzjonijiet u rikompilazzjonijiet ta' mistoqsijiet u n-numru ta' lottijiet riċevuti minn istanza ta' SQL Server jipprovdi għarfien dwar kemm SQL Server jesegwixxi malajr il-mistoqsijiet tal-utent u kemm jipproċessahom b'mod effiċjenti l-ottimizzatur tal-mistoqsijiet.

    1. Talbiet tal-lott/sek
      In-numru ta' pakketti ta' kmand Transact-SQL riċevuti kull sekonda. Din l-istatistika hija affettwata minn kwalunkwe limitazzjoni (I/O, numru ta’ utenti, daqs tal-cache, kumplessità tal-mistoqsijiet, eċċ.). Numru għoli ta' talbiet ta' pakkett jindika produttività għolja.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Talbiet ta' Lott ta' Statistika SQL/sek",30]

Minbarra dan kollu ta 'hawn fuq, tista' wkoll tikkonfigura elementi oħra tad-dejta (kif ukoll toħloq triggers fuqhom b'notifiki sussegwenti). Per eżempju:
1) l-ammont ta 'spazju disk ħieles
2) daqsijiet tal-fajls tad-data tad-database u zkuk
eċċ.
Madankollu, dawn l-indikaturi kollha ma jurux il-problema ta 'mistoqsijiet f'ħin reali.
Biex tagħmel dan, għandek bżonn toħloq il-bankijiet speċjali tiegħek.
Minħabba raġunijiet ta' kunfidenzjalità, mhux se nagħti eżempji ta' tali counters. Barra minn hekk, huma kkonfigurati unikament għal kull sistema. Imma ninnota li għal sistemi bħal 1C, NAV u CRM, jistgħu jinħolqu counters speċjalizzati flimkien mal-iżviluppaturi rilevanti.
Se nagħti eżempju tal-ħolqien ta' indikatur ġeneralizzat li juri kemm qed isiru talbiet u kemm hemm talbiet pendenti (sospiżi jew imblukkati) f'kull punt fiż-żmien.
Biex tagħmel dan, għandek bżonn toħloq proċedura maħżuna:
Kodiċi

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

Sussegwentement, trid tmur fil-folder fejn jinsab Zabbix (zabbixconfuserparams.d) u toħloq 2 fajls bl-estensjoni ps1 (PowerShell) u tikteb il-kodiċijiet li ġejjin f'kull wieħed minnhom:
Kodiċi għat-tmexxija tal-mistoqsijiet

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

Kodiċi għal talbiet pendenti

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

Issa trid toħloq fajl b'parametri tal-utent u estensjoni .conf (jew iżżid linji ma' fajl tal-utent eżistenti bħal dan, jekk inħoloq wieħed qabel) u daħħal il-linji li ġejjin:
UserParameter=PARAMETER_NAME_NUMBER_of_QUERIES EŻEKUTI, 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
Wara dan, issalva l-fajl .conf u terġa 'tibda l-aġent Zabbix.
Wara dan, inżidu żewġ elementi ġodda ma' Zabbix (f'dan il-każ, l-ismijiet u ċ-ċavetta huma l-istess):
PARAMETER_NAME_NUMRU TA'_TALBIET IMWETTQA
PARAMETER_NAME_NUMBER OF_WAITING_REQUESTS
Issa tista 'toħloq graphs u triggers għal oġġetti ta' data personalizzat maħluqa.

Jekk in-numru ta' talbiet pendenti jiżdied b'mod qawwi, allura l-mistoqsija li ġejja tista' turi t-talbiet kollha għaddejjin u pendenti f'ħin partikolari b'dettalji minn fejn u taħt liema login titwettaq it-talba, it-test u l-pjan ta' mistoqsija, kif ukoll dettalji oħra:
Kodiċi

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

Ħa nfakkarkom ukoll li skont l-istatistika miġbura tista' tikseb l-aktar mistoqsijiet diffiċli:
Kodiċi

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

Tista 'wkoll tikteb għal MySQL. Biex tagħmel dan għandek bżonn tinstalla mysql-connector-net u mbagħad ikteb kodiċi bħal dan:
Kodiċi għal talbiet pendenti

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

Riżultat

Dan l-artikolu ħares lejn eżempju ta 'counters tal-prestazzjoni (oġġetti tad-dejta) f'Zabbix. Dan l-approċċ jippermetti lill-amministraturi jiġu nnotifikati dwar diversi problemi f'ħin reali jew wara xi żmien speċifiku. Għalhekk, dan l-approċċ jippermettilna li nimminimizzaw l-okkorrenza ta 'problema kritika fil-futur u nwaqqfu l-operat tad-DBMS u s-server, li mbagħad jipproteġi l-produzzjoni milli jwaqqaf il-proċessi tax-xogħol.
Artiklu preċedenti: Xogħol ta’ rutina mad-database tas-sistema ta’ informazzjoni 24×7 f’MS SQL Server

Sorsi:

» Zabbix 3.4
» Counters tal-prestazzjoni
» Ċentru ta' Prestazzjoni għal Azure SQL Database u SQL Server Database Engine
» Stil ta' Ħajja SQL
» SQLSkills
» TechNet Microsoft
» L-analiżi tal-użu tal-memorja
» Analiżi tal-Prestazzjoni
» Dokumentazzjoni SQL
» Noti dwar Windows

Sors: www.habr.com

Żid kumment