Ag baint úsáide as Zabbix chun Monatóireacht a dhéanamh ar Bhunachar Sonraí Freastalaí MS SQL

Réamhrá

Is minic is gá tuairisc a thabhairt don riarthóir i bhfíor-am faoi fhadhbanna a bhaineann leis an mbunachar sonraí (bunachar sonraí).

Déanfaidh an t-alt seo cur síos ar cad is gá a chumrú i Zabbix chun monatóireacht a dhéanamh ar bhunachar sonraí MS SQL Server.

Tabhair faoi deara le do thoil nach dtabharfar sonraí maidir le conas a chumrú, áfach, tabharfar foirmlí agus moltaí ginearálta, chomh maith le cur síos mionsonraithe ar eilimintí sonraí saincheaptha a chur leis trí nósanna imeachta stóráilte san Airteagal seo.
Chomh maith leis sin, ní dhéanfar ach na príomh-áiritheoirí feidhmíochta a phlé anseo.

cinneadh

Ar dtús, déanfaidh mé cur síos ar na áiritheoirí feidhmíochta sin go léir (trí eilimintí sonraí in Zabbix) a theastaíonn uainn:

  1. Diosca Loighciúil
    1. Meán Diosca soic/Léamh
      Taispeánann sé an meán-am, arna shloinneadh i soicindí, chun sonraí a léamh ón diosca. Meánluach gcuntar feidhmíochta. Níor chóir go mbeadh soic diosca/Léamh níos mó ná 10 milleasoicind. Luach uasta an chuntar feidhmíochta Meán Fómhair. Níor chóir go mbeadh soic diosca/Léamh níos mó ná 50 milleasoicind.

      Zabbix: perf_counter[ LogicalDisk(_Iomlán)Avg. Diosca soic/Léamh], agus tá sé tábhachtach freisin súil a choinneáil ar an diosca atá ag teastáil, mar shampla mar seo: perf_counter[LogicalDisk(C:)Avg. Soic diosca/Léigh]

      Samplaí truicear:
      {NODE_NAME:perf_counter[ LogicalDisk(_Total)Avg. Diosca soic/Léamh].last()}> 0.005, leibhéal-ard
      и
      {NODE_NAME:perf_counter[ LogicalDisk(_Total)Avg. Diosca soic/Léamh].last()}> 0.0025, meánleibhéal

    2. Meán Diosc soic/Scríobh
      Léiríonn sé an meán-am, arna shloinneadh i soicindí, chun sonraí a scríobh chuig diosca. Meánluach gcuntar feidhmíochta. Níor chóir go mbeadh soic diosca/Scríobh níos mó ná 10 milleasoicind. Luach uasta an chuntar feidhmíochta Meán Fómhair. Níor chóir go mbeadh soic diosca/Scríofa níos mó ná 50 milleasoicind.

      Zabbix: perf_counter[ LogicalDisk(_Iomlán)Avg. Diosca soic/Scríobh], agus tá sé tábhachtach freisin súil a choinneáil ar an diosca atá ag teastáil, mar shampla mar seo: perf_counter[LogicalDisk(C:)Avg. Soic diosca/Scríobh]

      Samplaí truicear:
      {NODE_NAME:perf_counter[ LogicalDisk(_Total)Avg. Soic diosca/Scríobh].last()}> 0.005, leibhéal-ard
      и
      {NODE_NAME:perf_counter[ LogicalDisk(_Total)Avg. Soic diosca/Scríobh].last()}> 0.0025, meánleibhéal

    3. Meán Fad scuaine Diosca

      Meánfhad scuaine na n-iarratas ar an diosca. Taispeáineann sé líon na n-iarratas diosca ar feitheamh próiseála laistigh de eatramh ama sonraithe. Meastar go bhfuil scuaine nach mó ná 2 le haghaidh diosca amháin mar ghnáthchaint. Má tá níos mó ná dhá iarratas sa scuaine, is féidir go mbeidh an diosca ró-ualaithe agus ní féidir iarratais a thagann isteach a phróiseáil. Is féidir leat a fháil amach go díreach cad iad na hoibríochtaí nach féidir leis an diosca a láimhseáil trí úsáid a bhaint as cuntair Meánlíon. Diosca Léigh Fad na scuaine agus Meán Fómhair. Fad scuaine Diosca Wright (scuaine na n-iarratas scríofa).
      Meánluach Ní thomhaistear Fad scuaine Diosca, ach ríomhtar é trí úsáid a bhaint as dlí Little ó theoiric matamaitice na scuaine. De réir an dlí seo, tá líon na n-iarratas atá ag fanacht le próiseáil, ar an meán, comhionann le minicíocht na n-iarratas arna iolrú faoin am próiseála iarratais. Iad siúd. inár gcás Meán Fómhair. Fad scuaine an Diosca = (Aistrithe Diosca/soic) * (Avg. Soic Diosca/Aistriú).

      Meán Tugtar Fad scuaine Diosca mar cheann de na príomh-chuntar chun an t-ualach ar an bhfochóras diosca a chinneadh, áfach, chun é a mheas go leordhóthanach, is gá struchtúr fisiceach an chórais stórála a léiriú go cruinn. Mar shampla, le haghaidh tiomántán crua amháin meastar go bhfuil luach níos mó ná 2 ríthábhachtach, agus má tá an diosca suite ar shraith RAID de 4 dhiosca, ba chóir duit a bheith buartha má tá an luach níos mó ná 4*2=8.

      Zabbix: perf_counter[ LogicalDisk(_Iomlán)Avg. Fad scuaine an Diosca], ​​agus tá sé tábhachtach freisin súil a choinneáil ar an diosca atá ag teastáil, mar shampla mar seo: perf_counter[LogicalDisk(C:)Avg. Fad scuaine an Diosca]

  2. cuimhne
    1. Leathanaigh/soic
      Taispeánann sé líon na leathanach a léigh Freastalaí SQL ó dhiosca nó a scríobh chuig diosca chun rochtain ar leathanaigh chuimhne nár lódaíodh isteach i RAM tráth na rochtana a réiteach. Is ionann an luach seo agus suim Ionchuir Leathanaigh/soicind agus Aschur/soicindí Leathanaigh, agus cuireann sé san áireamh freisin glaoireachta (leathanaigh/bhabhtáil) taisce an chórais chun comhaid sonraí feidhmchláir a rochtain. Ina theannta sin, cuimsíonn sé seo glaoch ar chomhaid neamh-thaisce atá mapáilte go díreach isteach sa chuimhne. Is é seo an príomh-chuntar ar chóir monatóireacht a dhéanamh air má tá ardúsáid cuimhne agat agus an iomarca glaoireachta a bhaineann leis. Is sainairíonna é an cuntar seo an méid babhtála agus ba cheart go mbeadh a ghnáthluach (ní buaic) gar do nialas. Léiríonn méadú ar mhalartú go bhfuil gá le RAM a mhéadú nó líon na gclár feidhmchláir a ritheann ar an bhfreastalaí a laghdú.

      Zabbix: perf_cuntar[Leathanaigh Chuimhne/soic] Sampla truicear:
      {NODE_NAME:perf_cuntar[MemoryPages/soic]. nóim(5m)}> 1000, faisnéis leibhéil

    2. Leathanach Lochtanna/soic

      Seo é luach cuntair locht an leathanaigh. Tarlaíonn locht leathanach nuair a dhéanann próiseas tagairt do leathanach cuimhne fíorúil nach bhfuil sa tacar oibre RAM. Cuireann an cuntar seo san áireamh na lochtanna leathanach sin a dteastaíonn rochtain diosca orthu, agus iad siúd is cúis leis an leathanach a bheith lasmuigh den tacar oibre in RAM. Is féidir le formhór na bpróiseálaithe lochtanna leathanach Cineál XNUMX a láimhseáil gan mórán moille. Mar sin féin, d’fhéadfadh moill shuntasach a bheith mar thoradh ar láimhseáil lochtanna leathanach cineál XNUMX a éilíonn rochtain diosca.

      Zabbix: perf_cuntar[MemoryPage Lochtanna/soic] Sampla truicear:
      {NODE_NAME:perf_cuntar[MemoryPage Lochtanna/soicind].nóim(5m)}> 1000, faisnéis leibhéil

    3. Bearta ar Fáil

      Coinnítear súil ar an méid cuimhne atá ar fáil i mbearta chun próisis éagsúla a rith. Léiríonn léamha ísle cuimhne íseal. Is é an réiteach ná cuimhne a mhéadú. I bhformhór na gcásanna ba cheart go mbeadh an méadar seo os cionn 5000 kV i gcónaí.
      Déanann sé ciall an tairseach do Mbytes Ar Fáil a shocrú de láimh ar na cúiseanna seo a leanas:

      • 50% cuimhne in aisce ar fáil = Ar fheabhas
      •25% cuimhne ar fáil = Teastaíonn aird
      •10% in aisce = fadhbanna féideartha
      • Níos lú ná 5% de chuimhne ar fáil = ríthábhachtach maidir le luas, ní mór duit idirghabháil a dhéanamh.
      Zabbix: perf_cuntar[MemoryAvailable Bytes]

  3. Próiseálaí (Iomlán): % Am Próiseálaí
    Léiríonn an cuntar seo an céatadán ama a bhí an próiseálaí gnóthach ag déanamh oibríochtaí le haghaidh snáitheanna neamhdhomhaoin. Is féidir an luach seo a mheas mar chomhréir an ama a chaitear ar obair úsáideach. Is féidir snáithe díomhaoin a shannadh do gach próiseálaí, a ídíonn timthriallta próiseálaí neamhtháirgiúla nach n-úsáideann snáitheanna eile. Is sainairíonna é an gcuntar seo ná beanna gearra ar féidir leo 100 faoin gcéad a bhaint amach. Mar sin féin, má tá tréimhsí fada ann ina bhfuil úsáid próiseálaí os cionn 80 faoin gcéad, beidh an córas níos éifeachtaí ag baint úsáide as níos mó próiseálaithe.

    Zabbix: perf_counter[Próiseálaí(_Iomlán)% Próiseálaí Am], anseo is féidir é a thaispeáint freisin de réir croí
    Sampla truicear:
    {NODE_NAME:perf_counter[Próiseálaí(_Iomlán)% Am Próiseálaí]. nóim(5m)}> 80, faisnéis leibhéil

  4. Comhéadan Líonra (*): % Beart Iomlán/soic
    Líon iomlán na mbeart a seoladh agus a fuarthas in aghaidh an tsoicind ar fud na gcomhéadan uile. Is é seo an bandaleithead comhéadan (i bytes). Is gá luach an chuntar seo a chur i gcomparáid le bandaleithead uasta an chárta líonra. Go ginearálta, níor cheart go léireodh an gcuntar seo úsáid níos mó ná 50% as bandaleithead an oiriúnaitheora líonra.
    Zabbix: perf_cuntar[Comhéadan Líonra(*)Beirteanna Seolta/soic]
  5. MS SQL Server: Modhanna Rochtana
    Soláthraíonn an réad Modhanna Rochtana i Freastalaí SQL cuntair chun cabhrú le rochtain ar shonraí loighciúla laistigh de bhunachar sonraí a rianú. Déantar rochtain fhisiciúil ar leathanaigh bhunachar sonraí ar dhiosca a rialú trí úsáid a bhaint as cuntair bhainisteoirí maoláin. Cabhraíonn monatóireacht ar na modhanna rochtana sonraí sa bhunachar sonraí le cinneadh an féidir feidhmíocht fiosrúcháin a fheabhsú trí innéacsanna a chur leis nó a athrú, deighiltí a chur leis nó a bhogadh, comhaid nó grúpaí de chomhaid a chur leis, innéacsanna a dhífragáil, nó téacs na gceisteanna a athrú. Ina theannta sin, is féidir leat cuntair oibiachta Modhanna Rochtana a úsáid chun monatóireacht a dhéanamh ar mhéid na sonraí, na n-innéacsanna, agus an spáis saor i do bhunachar sonraí, ag déanamh monatóireachta ar chumas agus ar ilroinnt gach freastalaí. Féadfaidh ilroinnt innéacs iomarcach feidhmíocht a laghdú go suntasach.

    1. Scoilteanna Leathanach/soic
      Líon na scoilteanna leathanach in aghaidh an tsoicind a dhéantar mar thoradh ar thar maoil leathanach innéacs. Ciallaíonn luach ard ar an méadrach seo go gcaithfidh Freastalaí SQL, agus oibríochtaí ionsáite agus nuashonraithe ar shonraí á ndéanamh, líon mór oibríochtaí atá dian ar acmhainní a dhéanamh chun leathanaigh a scoilt agus cuid de leathanach atá ann cheana a aistriú go dtí suíomh nua. Ba cheart oibríochtaí den sórt sin a sheachaint nuair is féidir. Is féidir leat iarracht a dhéanamh an fhadhb a réiteach ar dhá bhealach:
      — cruthaigh innéacs cnuasaithe le haghaidh colúin um incrimintiú uathoibríoch. Sa chás seo, ní chuirfear taifid nua laistigh de leathanaigh atá áitithe ag sonraí cheana féin, ach áiteofar leathanaigh nua go seicheamhach;
      — innéacsanna a atógáil trí luach an pharaiméadar Fillfactor a mhéadú. Ligeann an rogha seo duit spás saor in aisce a chur in áirithe i leathanaigh innéacs a úsáidfear chun freastal ar shonraí nua, gan gá le hoibríochtaí scoilteadh leathanach.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Modhanna Rochtana Scoilteanna/soicind", 30] Sampla truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Modhanna Rochtana Scoilteanna/soicind" /30, leibhéal-eolas
    2. Scananna Iomlána/soic
      Líon neamhtheoranta scananna iomlána in aghaidh an tsoicind. Áiríonn na hoibríochtaí seo scanadh príomhthábla agus scanadh innéacs iomlán. D’fhéadfadh méadú cobhsaí ar an táscaire seo díghrádú an chórais a léiriú (easpa innéacsanna riachtanacha, a n-ilroinnt ghéar, teip ar an leas iomlán a bhaint as innéacsanna atá ann cheana féin, láithreacht innéacsanna neamhúsáidte). Mar sin féin, is fiú a thabhairt faoi deara nach bhfuil scanadh iomlán i dtáblaí beaga i gcónaí dona, mar más féidir leat an tábla iomlán a chur i RAM, beidh scanadh iomlán níos tapúla. Ach i bhformhór na gcásanna, léireoidh méadú cobhsaí ar an gcuntar seo díghrádú an chórais. Ní bhaineann sé seo go léir ach le córais OLTP. I gcórais OLAP, is gnách scanadh iomlána leanúnacha.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Rochtana Modhanna Iomlán Scans/soic", 30]

  6. MS SQL Server: Bainisteoir Maoláin
    Soláthraíonn réad an Bhainisteora Maoláin cuntair a chuidíonn leat monatóireacht a dhéanamh ar an gcaoi a n-úsáideann Freastalaí SQL na hacmhainní seo a leanas:
    — cuimhne chun leathanaigh sonraí a stóráil;
    - cuntair a dhéanann monatóireacht ar I/O fisiciúil de réir mar a léann agus a scríobhann Freastalaí SQL leathanaigh bhunachar sonraí;
    — leathnú linn maoláin chun an taisce maolánach a leathnú trí úsáid a bhaint as cuimhne thapa neamh-luaineach, amhail tiomántáin soladstaide (SSD);
    - Cuidíonn faireachán cuimhne agus cuntair a úsáideann SQL Server chun an fhaisnéis seo a leanas a fháil;
    — an bhfuil baic ann de bharr easpa cuimhne fhisiciúil. Mura féidir sonraí a rochtain go minic a stóráil sa taisce, tá iallach ar SQL Server é a léamh ón diosca;
    An féidir feidhmíocht fiosrúcháin a fheabhsú tríd an méid cuimhne a mhéadú nó cuimhne bhreise a leithdháileadh ar shonraí a thaisceadh nó struchtúir inmheánacha Freastalaí SQL a stóráil?
    — cé chomh minic a léann SQL Server sonraí ón diosca. I gcomparáid le hoibríochtaí eile cosúil le rochtain cuimhne, tógann sé níos faide I/O fisiciúil a chur i gcrích. Má laghdaítear I/O, féadtar feidhmíocht na gceisteanna a fheabhsú.

    1. Raidió Buffer Cache
      Léiríonn sé cé mhéad sonraí is féidir le Freastalaí SQL a chur leis an maolán taisce. Dá airde an luach seo, is amhlaidh is fearr, mar gheall ar Chun go bhféadfaidh Freastalaí SQL rochtain éifeachtach a fháil ar leathanaigh sonraí, caithfidh siad a bheith i maolán taisce, agus ní mór aon oibríochtaí ionchuir/aschuir fhisiciúil (I/O) a bheith ann. Má fheiceann tú laghdú seasta ar mheánluach an chuntar seo, ba cheart duit smaoineamh ar RAM a chur leis. Ba cheart go mbeadh an táscaire seo os cionn 90% i gcónaí do chórais OLTP agus os cionn 50% i gcás córais OLAP.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cóimheas buailte taisce",30] Samplaí truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cóimheas buailte taisce", 30].last()}<70, leibhéal-ard
      и
      {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerBuffer cóimheas buailte taisce", 30].last()}<80, meánleibhéal
    2. ionchas saoil leathanach
      Léiríonn sé cé chomh fada agus a fhanfaidh an leathanach i gcuimhne go buan mar atá sé faoi láthair. Má leanann an luach ag titim, ciallaíonn sé go bhfuil an córas ag baint mí-úsáide as an linn maolánach. Mar sin, d'fhéadfadh feidhmíocht chuimhne fadhbanna a bheith mar thoradh ar dhrochfheidhmíocht. Is fiú a thabhairt faoi deara nach bhfuil aon táscaire uilíoch faoina bhun ar féidir a mheas go soiléir go bhfuil an córas ag baint mí-úsáide as an linn maolánach (tá an táscaire 300 soicind as dáta ó MS SQL Server 2012).
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Bainisteoir Maoláin Leathanach ionchas saoil", 30] Sampla truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Buffer ManagerPage ionchas saoil", 30].last()}<5, faisnéis leibhéal

  7. MS SQL Server: Staitisticí Ginearálta
    Soláthraíonn an réad Staidrimh Ghinearálta i Freastalaí SQL cuntair a ligeann duit monatóireacht a dhéanamh ar ghníomhaíocht fhoriomlán an fhreastalaí, amhail líon na nasc comhthráthach agus líon na n-úsáideoirí in aghaidh an tsoicind a nascann leis an ríomhaire nó a dhícheanglaíonn ón ríomhaire a ritheann le Freastalaí SQL. Tá na méadrachtaí seo úsáideach i gcórais mhóra próiseála idirbheart ar líne (OLTP) ina mbíonn líon mór cliant i gcónaí ag nascadh agus ag dínascadh ó shampla de SQL Server.

    1. Próiseas bactha
      Líon na bpróiseas atá bacáilte faoi láthair.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Próisis Staidrimh Ghinearálta bactha", 30] Sampla truicear: ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Próisis Staidrimh Ghinearálta bactha", 30].nóim(2m,0)}>=0)
      agus ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Próisis Staidrimh Ghinearálta bactha",30].time(0)}>=50000)
      agus ({NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Próisis Staidrimh Ghinearálta bactha",30].time(0)}<=230000), leibhéal faisnéise (tá srianadh comharthaíochta anseo ó 05:00 go 23:00)
    2. Naisc Úsáideoirí
      Líon na n-úsáideoirí atá nasctha le Freastalaí SQL faoi láthair.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Ceangail Úsáideora Staitisticí Ginearálta", 30]

  8. MS SQL Server: Glais
    Soláthraíonn an réad Glais i Microsoft SQL Server faisnéis maidir le glais Freastalaí SQL a fuarthas le haghaidh cineálacha acmhainní aonair. Eisítear glais ar acmhainní Freastalaí SQL, cosúil le sraitheanna a léitear nó a mhodhnaítear trí idirbheart, chun idirbhearta iolracha a chosc ó úsáid a bhaint as an acmhainn ag an am céanna. Mar shampla, má fhaightear glas eisiach (X) trí idirbheart as a chéile i dtábla, ní féidir le haon idirbheart eile an tsraith sin a athrú go dtí go scaoiltear an glas. Íoslaghdú úsáid na glais méaduithe concurrency, is féidir a fheabhsú ar fheidhmíocht fhoriomlán. Is féidir roinnt cásanna den réad Glais a rianú ag an am céanna, agus beidh gach ceann díobh ina nglas ar chineál acmhainne ar leith.

    1. Meán Am Feithimh (ms)
      An meánfhad feithimh (i milleasoicindí) le haghaidh gach iarratas ar ghlas a raibh gá le feithimh ina leith. Léiríonn an cuntar seo cé chomh fada, ar an meán, a chaithfidh próisis úsáideoirí fanacht sa scuaine chun glas a fháil ar acmhainn. Braitheann uasluach incheadaithe an chuntair seo go hiomlán ar do thasc; tá sé deacair aon mheánluach a chinneadh do gach feidhmchlár. Má tá an cuntar seo ró-ard, d’fhéadfadh sé fadhbanna glasála a léiriú i do bhunachar sonraí.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Glasáil(_Iomlán)Meán-Am Feithimh (ms)", 30] Sampla truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Glas(_Iomlán)Meán-Am Feithimh (ms)", 30].last()}>=500, faisnéis leibhéal
    2. Glasáil Am Feithimh (ms)
      Am feithimh iomlán an ghlais (i milleasoicindí) thar an soicind deireanach.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Glasáil(_Iomlán)Glasáil Am Feithimh (ms)", 30]
    3. Glas Waits/soic
      An líon uaireanta sa soicind dheireanach a raibh ar snáithe fanacht mar gheall ar iarratas glasála.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Glasáil(_Iomlán)Glas Waits/soic", 30]
    4. Glasáil Teorainneacha Amanna/soic
      An líon uaireanta nach féidir an glas a fháil le robin chruinn. Cinneann luach paraiméadar cumraíochta cuntair casadh Freastalaí SQL an líon uaireanta is féidir le snáithe casadh sula n-amanna sé agus éiríonn an snáithe neamhghníomhach.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME: Glasáil(_Iomlán)Amanna Glasála/soicind", 30] Sampla truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Glais(_Iomlán)Glais(_Iomlán)Amanna Glasála/soic", 30].last()}>1000, faisnéis leibhéil
    5. Glas Iarratais/soic
      Líon na n-iarratas in aghaidh an tsoicind den chineál sonraithe glais.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME: Glasáil(_Iomlán)Iarratais Ghlais/soic", 30] Sampla truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Glas(_Iomlán)Iarratais Ghlais/soic", 30].last()}>500000, faisnéis leibhéil
    6. Glas Líon na nglas glas/soic
      Líon na n-iarratas glasála in aghaidh an tsoicind a mbíonn teorainn ama mar thoradh orthu. Léiríonn láithreacht na sloc dúnta ceisteanna nach bhfuil déanta go maith acu a chuireann bac ar acmhainní comhroinnte.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Líon na Spriocdháta/soicind", 30] Sampla truicear: {NODE_NAME:perf_counter["MSSQL$INSTANCE_NAME:Glas(_Iomlán)Líon na Spriocdhátaí/soic", 30].last()}>1, leibhéal-ard

  9. MS SQL Server: Bainisteoir Cuimhne
    Soláthraíonn an réad Bainisteoir Cuimhne i Microsoft SQL Server cuntair chun monatóireacht a dhéanamh ar úsáid chuimhne ar fud an fhreastalaí. Is féidir le monatóireacht a dhéanamh ar úsáid chuimhne an fhreastalaí iomlán chun gníomhaíocht úsáideora agus úsáid acmhainní a mheas cabhrú le baic feidhmíochta a aithint. Is féidir leis an monatóireacht chuimhne a úsáideann sampla de SQL Server cabhrú le cinneadh a dhéanamh:
    — cibé an bhfuil ganntanas cuimhne fhisiciúil leordhóthanach chun sonraí a úsáidtear go minic a stóráil sa taisce. Mura bhfuil go leor cuimhne ann, ní mór do SQL Server na sonraí a fháil ón diosca;
    - An bhféadfaí feabhas a chur ar fheidhmíocht fiosrúcháin dá gcuirfí cuimhne leis nó dá méadófaí an méid cuimhne atá ar fáil le haghaidh sonraí taisce nó struchtúir inmheánacha SQL Server.

    1. Deontais Chuimhne Gan Réiteach
      Léiríonn sé líon iomlán na bpróiseas ar éirigh leo cuimhne spás oibre a ghnóthú. Má thiteann an táscaire go seasta, is gá an RAM a mhéadú.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Deontais Cuimhne Bainisteoir Cuimhne Gan Réiteach", 30]
    2. Deontais Chuimhne ar Feitheamh
      Léiríonn sé líon iomlán na bpróiseas atá ag fanacht le cuimhne oibre a leithdháileadh. Le fás cobhsaí an táscaire, is gá RAM a mhéadú.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:Deontais Chuimhne Bainisteoir Cuimhne ar Feitheamh", 30]

  10. MS SQL Server: Staitisticí
    Soláthraíonn an réad Staitisticí i Microsoft SQL Server cuntair chun monatóireacht a dhéanamh ar thiomsú agus ar chineálacha na bhfiosrúchán a chuirtear chuig freastalaí SQL mar shampla. Soláthraíonn monatóireacht ar líon na dtiomsúchán fiosrúchán agus na n-athchruinnithe agus ar líon na mbaisceanna a fhaigheann cás de chuid Freastalaí SQL léargas ar cé chomh tapa agus a dhéanann Freastalaí SQL fiosruithe úsáideoirí agus cé chomh héifeachtach agus a phróiseálann an t-uasmhéadaitheoir fiosrúcháin iad.

    1. Iarratais Baisc/soic
      Líon na bpacáistí ordaithe Transact-SQL a fuarthas in aghaidh an tsoicind. Bíonn tionchar ag teorainneacha ar bith ar na staitisticí seo (I/O, líon na n-úsáideoirí, méid an taisce, castacht na gceisteanna, etc.). Léiríonn líon ard iarratas ar phaicéad tréchur ard.
      Zabbix: perf_counter["MSSQL$INSTANCE_NAME:SQL StatisticsBatch Iarratais/soic", 30]

Chomh maith leis na nithe thuas go léir, is féidir leat eilimintí sonraí eile a chumrú (chomh maith le truicear a chruthú orthu le fógraí ina dhiaidh sin).
1) an méid spáis diosca saor in aisce
2) méideanna na gcomhad sonraí bunachar sonraí agus logs
agus mar sin de.
Mar sin féin, ní léiríonn na táscairí seo go léir fadhb na bhfiosruithe fíor-ama.
Chun seo a dhéanamh, ní mór duit do cuntair speisialta féin a chruthú.
Ar chúiseanna rúndachta, ní thabharfaidh mé samplaí de chuntair dá leithéid. Thairis sin, tá siad cumraithe uathúil do gach córas. Ach tugaim faoi deara gur féidir cuntair speisialaithe a chruthú i gcomhar leis na forbróirí ábhartha do chórais mar 1C, NAV agus CRM.
Tabharfaidh mé sampla de tháscaire ginearálaithe a chruthú a thaispeánann cé mhéad iarratas atá ar siúl agus cé mhéad iarratas atá ar feitheamh (ar fionraí nó bac) ag gach pointe ama.
Chun seo a dhéanamh, ní mór duit nós imeachta stóráilte a chruthú:
Cód

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

Ansin, ní mór duit dul go dtí an fillteán ina bhfuil Zabbix suite (zabbixconfuserparams.d) agus 2 chomhad a chruthú leis an síneadh ps1 (PowerShell) agus scríobh na cóid seo a leanas i ngach ceann acu:
Cóid le haghaidh ceisteanna a rith

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

Cód le haghaidh iarratais ar feitheamh

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

Anois ní mór duit comhad a chruthú le paraiméadair úsáideora agus síneadh .conf (nó cuir línte le comhad úsáideora den sórt sin atá ann cheana féin, má cruthaíodh ceann níos luaithe) agus cuir isteach na línte seo a leanas:
UserParameter=PARAMETER_NAME_NUMBER_of_QUERIES EXECUTED,powershell -NoProfile -ExecutionPolicy Sheachbhóthar -Comhad FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_EXECUTED_QUERYES.ps1
UserParameter=PARAMETER_NAME_NUMBER_WAITING_REQUESTS,shellpower -NoProfile -ExecutionPolicy Seachbhóthar -Comhad FULL_PATHzabbixconfuserparams.dFILE_NAME_FOR_WAITING_REQUESTS.ps1
Tar éis seo, sábháil an comhad .conf agus atosaigh an gníomhaire Zabbix.
Tar éis seo, cuirimid dhá eilimint nua le Zabbix (sa chás seo, tá na hainmneacha agus an eochair mar an gcéanna):
PARAMETER_NAME_NUMBER OF_REQUESTS PERFORMED
PARAMETER_NAME_NUMBER OF_WAITING_REQUESTS
Is féidir leat graif agus truicear a chruthú anois le haghaidh míreanna sonraí saincheaptha cruthaithe.

Má thagann méadú géar ar líon na n-iarratas ar feitheamh, is féidir leis an gceist seo a leanas gach iarratas reatha agus ar feitheamh a thaispeáint ag am ar leith le sonraí ón áit agus faoin logáil isteach a dhéantar an t-iarratas, an téacs agus an plean fiosrúcháin, chomh maith le sonraí eile:
Cód

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

Cuir i gcuimhne duit freisin gur féidir na ceisteanna is deacra a fháil de réir na staitisticí bailithe:
Cód

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

Is féidir leat scríobh freisin do MySQL. Chun seo a dhéanamh ní mór duit a shuiteáil mysql-nascaire-líon agus ansin scríobh cód mar seo:
Cód le haghaidh iarratais ar feitheamh

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

Toradh

D’fhéach an t-alt seo ar shampla de áiritheoirí feidhmíochta (míreanna sonraí) in Zabbix. Ligeann an cur chuige seo do riarthóirí a chur ar an eolas faoi fhadhbanna éagsúla i bhfíor-am nó tar éis roinnt ama ar leith. Mar sin, ceadaíonn an cur chuige seo dúinn tarlú fadhb chriticiúil sa todhchaí a íoslaghdú agus oibriú an DBMS agus an fhreastalaí a stopadh, rud a chosnaíonn táirgeadh ó phróisis oibre a stopadh.
Alt roimhe seo: Obair rialta le bunachar sonraí an chórais faisnéise 24×7 in MS SQL Server

Foinsí:

» Zabbix 3.4
» Áiritheoirí feidhmíochta
» Ionad Feidhmíochta do Bhunachar Sonraí Azure SQL agus Inneall Bunachar Sonraí Freastalaí SQL
» Stíl Mhaireachtála SQL
» SQLSkills
» TechNet Microsoft
» Anailís a dhéanamh ar úsáid cuimhne
» Anailís Feidhmíochta
» Doiciméadúchán SQL
» Nótaí faoi Windows saor in aisce,

Foinse: will.com

Add a comment