Aleksei Lesovski 2015. aasta ettekande "SĂŒgav tutvumine PostgreSQL sisestatistikaga" tĂ”lgendus
KĂ€esoleva ettekande autori mĂ€rkus: Tahan mĂ€rkida, et see ettekande kuupĂ€ev on novembrist 2015 â sellest ajast on möödunud ĂŒle 4 aasta ja palju on muutunud. Ettekandes kĂ€sitletud versioon 9.4 ei ole enam toetatud. Viimase 4 aasta jooksul on ilmunud 5 uut versiooni, mis on toonud endaga kaasa hulga uuendusi, tĂ€iustusi ja muudatusi seoses statistika ja osa materjalist on vananenud ja ei ole enam asjakohane. Ălevaate kĂ€igus pĂŒĂŒdsin mĂ€rkida neid kohti, et mitte eksitada sind, lugeja. Ma ei kirjutanud neid kohti aga ĂŒmber, neid on liiga palju ja lĂ”puks oleks saanud hoopis teistsugune ettekande.
PostgreSQL andmebaasihaldussĂŒsteem on tohutu mehhanism, mis koosneb paljusid alam-sĂŒsteeme, mille sujuv töö sĂ”ltub otseselt andmebaasi jĂ”udlusest. Töö kĂ€igus tagatakse statistika ja teabe kogumine komponentide toimimisest, mis vĂ”imaldab hinnata PostgreSQL-i efektiivsust ja vĂ”tta meetmeid jĂ”udluse tĂ”stmiseks. Kuid seda teavet on vĂ€ga palju ja see on esitatud suhteliselt lihtsustatud vormis. Selle teabe töötlemine ja tĂ”lgendamine on aeg-ajalt tĂ€iesti mittetriviaalne ĂŒlesanne ning tööriistade ja utiliitide "loomaaed" vĂ”ib isegi edasijĂ”udnut DBA-d segadusse ajada.


Tere! Minu nimi on Aleksei. Nagu Ilja ĂŒtles, rÀÀgin teile PostgreSQL statistikatest.

PostgreSQL aktiivsuse statistika. PostgreSQL-il on kaks statistikat. Aktiivsuse statistika, millest jutt tuleb. Ja planeerija statistika andmete jaotuse kohta. RÀÀgin tÀna just PostgreSQL-i aktiivsuse statistikast, mis vÔimaldab meil hinnata jÔudlust ja kuidas seda ka parandada.
RÀÀgin, kuidas tÔhusalt kasutada statistikat erinevate probleemide lahendamiseks, millega te seisate silmitsi vÔi vÔite kokku puutuda.

Mida ettekandes ei kÀsitleta? Ettekandes ei puuduta ma planeerija statistikat, kuna see on eraldi teema, eraldi ettekande teema, kuidas andmed andmebaasis salvestatakse ja kuidas planeerija saab teavet andmete kvaliteetsete ja koguslike omaduste kohta.
Ja ma ei tee tööriistade ĂŒlevaateid, ma ei vĂ”rdle ĂŒhte toodet teisega. Reklaami ei tule. JĂ€tame selle kĂ”rvale.

Soovin teile nÀidata, et statistika kasutamine on kasulik. See on vajalik. Selle kasutamine ei ole hirmutav. Me vajame vaid tavalist SQL-i ja pÔhiteadmisi SQL-ist.
Ja rÀÀgime, millist statistikat valida probleemide lahendamiseks.

Kui vaatame PostgreSQL-i ja kĂ€ivitame operatsioonisĂŒsteemis kĂ€su, et nĂ€ha protsesse, siis nĂ€eme "must kasti". NĂ€eme mingeid protsesse, mis midagi teevad, ja saame nimede jĂ€rgi umbkaudu aru, millega nad tegelevad. Kuid tegelikult on see must kast, mille sisse me ei nĂ€e.
Saame vaadata protsessori koormust top, saame vaadata mĂ€lu kasutust mĂ”ne sĂŒsteemi utiliidi abil, kuid PostgreSQL-i sisse me ei nĂ€e. Selleks on meil vaja teisi tööriistu.

Ja jÀtkates rÀÀgiksin, kuhu kulub aeg. Kui kujutame PostgreSQL-i skeemi kujul, saame vastata, kuhu aeg kulub. Need on kaks asja: kliendipÀringute töötlemine rakendustelt ja taustategevused, mida PostgreSQL teeb oma toimimise tagamiseks.
Kui hakkame vaatama vasakust ĂŒlanurgast, saame jĂ€lgida, kuidas kliendipĂ€ringud töödeldakse. PĂ€ring tuleb rakenduselt ja edasise töö jaoks avatakse kliendi seanss. PĂ€ring edastatakse planeerijale. Planeerija koostab pĂ€ringu plaani. Saadetakse see edasise tĂ€itmise jaoks. Toimub mingisugune plokk-andmete sisendi-vĂ€ljundi operatsioon, mis on seotud tabelite ja indeksitega. Vajalikud andmed loetakse kettadelt mĂ€llu spetsiaalsesse piirkonda "shared buffers". PĂ€ringu tulemused, kui need on uuendused, kustutamised, salvestatakse tehingu pĂ€evikusse WAL-i. MĂ”ned statistilised andmed satuvad logisse vĂ”i statistika kogujasse. Ja pĂ€ringu tulemus antakse juba kliendile tagasi. PĂ€rast seda vĂ”ib klient kĂ”ik uuesti alustada uue pĂ€ringuga.
Kuidas on taustategevuste ja taustaprotsessidega? Meil on mitmeid protsesse, mis tagavad toimimise ja toetavad andmebaasi normaalset tööreĆŸiimi. Need protsessid kajastuvad samuti ettekandes: autovacuum, checkpointer, replikatsiooniga seotud protsessid, background writer. IgaĂŒht neist kĂ€sitlen ettekande kĂ€igus.

Milliseid probleeme on statistika kasutamisel?
- Teavet on palju. PostgreSQL 9.4 pakub 109 meetrit statistika andmete vaatamiseks. Siiski, kui andmebaasis on palju tabeleid, skeeme, baase, tuleb kÔiki neid mÔÔdikuid korrutada vastava tabelite, baaside arvuga. See tÀhendab, et teavet on veelgi rohkem. Ja selles Àra uppuda on vÀga lihtne.
- JĂ€rgmine probleem on see, et statistika on esitatud loenditest. Kui me vaatame seda statistikat, nĂ€eme pidevalt suurenevaid loendeid. Ja kui alates statistika nullimises on möödunud palju aega, nĂ€eme miljardilisi vÀÀrtusi. Need ei ĂŒtle meile midagi.
- Ajalugu puudub. Kui teil on toimunud mingi tÔrge, mis juhtus 15-30 minutit tagasi, ei saa te kasutada statistikat ja vaadata, mis juhtus 15-30 minutit tagasi. See on probleem.
- PostgreSQL-i sisseehitatud tööriista puudumine on probleem. Tuuma arendajad ei paku ĂŒhtegi utiliiti. Neil pole midagi sellist. Nad annavad lihtsalt statistika andmebaasis. Kasutage, koostage pĂ€ring, mida soovite, seda tehke.
- Kuna PostgreSQL-is ei ole sisseehitatud tööriista, on see pĂ”hjuseks teisele probleemile. Palju kolmandate osapoolte tööriistu. Igas firmas, kus on vĂ€hemalt veidi oskuslikke kĂ€si, pĂŒĂŒab kirjutada oma programmi. Ja lĂ”puks on kogukonnas palju tööriistu, mida saab kasutada statistika töötlemiseks. Ăhtedes tööriistades on teatud funktsioonid, teistes aga ei ole neid funktsioone vĂ”i on mĂ”ned uued funktsioonid. Ja tekib olukord, kus tuleb kasutada kahte-kolme-nelja tööriista, mis kattuvad ja omavad erinevaid funktsioone. See on vĂ€ga ebameeldiv.

Mida sellest jÀreldub? Oluline on osata statistikat otse vÔtta, et mitte sÔltuda programmidest, vÔi kuidagi ise neid programme tÀiustada: lisada mÔned funktsioonid, et saada kasu.
Ja on vajalikud pÔhiteadmised SQL-ist. Et saada statistika andmeid, tuleb koostada SQL pÀringud, st peate teadma, kuidas luua select, join.

Statistika pakub meile mitmeid asju. Need saab jagada kategooriatesse.
- Esimene kategooria on sĂŒndmused, mis toimuvad andmebaasis. See on siis, kui andmebaasis toimub mĂ”ni sĂŒndmus: pĂ€ring, tabeli juurde pÀÀsemine, automaatne vahekohtumine, kinnitused â kĂ”ik need on sĂŒndmused. Nende sĂŒndmustega seotud loendurid suurenevad. Me saame jĂ€lgida neid sĂŒndmusi.
- Teine kategooria on objektide omadused, nagu tabelid ja andmebaasid. Neil on omadused. See on tabelite suurus. Saame jĂ€lgida tabelite kasvu, indeksite kasvu. Saame vaadata muutusi dĂŒnaamikas.
- Kolmas kategooria on sĂŒndmusele kuluv aeg. PĂ€ring on sĂŒndmus. Sellel on oma konkreetne kestuse mÔÔt. Siin kĂ€ivitati, siin lĂ”petati. Saame seda jĂ€lgida. Kas siis olema ajaks, mis kulus ploki lugemiseks kettalt vĂ”i kirjutamiseks. Selliseid asju jĂ€lgitakse samuti.

Statistika allikad on esitatud jÀrgmisel viisil:
- Jagatud mĂ€lu (shared buffers) sisaldab segmenti statistiliste andmete salvestamiseks, seal on ka need samad loendurid, mis pidevalt suurenevad, kui need vĂ”i need sĂŒndmused toimuvad, vĂ”i tekivad andmebaasi töös mingid hetked.
- KÔik need loendurid ei ole kasutajale ja isegi administraatorile kergesti kÀttesaadavad. Need on madala taseme asjad. Nendele juurde pÀÀsemiseks pakub PostgreSQL liidest SQL funktsioonide nÀol. Saame nende funktsioonide abil teha select pÀringuid ja saada mingeid mÔÔdikuid (vÔi mÔÔdikutest koosnevaid komplekte).
- Siiski, nende funktsioonide kasutamine ei ole alati mugav, seega on funktsioonid pĂ”hiks vaadete (VIEWs) koostamiseks. Need on virtuaalsed tabelid, mis pakuvad statistikat konkreetse alamsĂŒsteemi vĂ”i andmebaasi mingite sĂŒndmuste kogumi kohta.
- Need sisseehitatud vaated (VIEWs) on peamine kasutajaliides statistika töötlemiseks. Need on saadaval vaikimisi ilma lisaseadeteta, saate neid kohe kasutada, vaadata, jne sealt teavet vÔtta. Ja on ka contrib'id. Contrib'id on ametlikud. Saate installida paketi postgresql-contrib (nÀiteks postgresql94-contrib), laadides vajalikud moodulid konfiguratsiooni, mÀÀrates neile parameetrid, taaskÀivitades PostgreSQL ja saate kasutada. (MÀrkus. Olenevalt distributsioonist on viimastes versioonides contrib-pakett osa pÔhiversioonist.).
- Ja on olemas mitteametlikud contrib. Need ei kuulu PostgreSQL standardpaketti. Need tuleb kas kompileerida vÔi installida teekina. Valikud vÔivad olla vÀga erinevad, sÔltuvalt sellest, mida on vÀlja mÔelnud selle mitteametliku contrib'i arendaja.

Sellel slaidil on esitatud kĂ”ik need vaated (VIEWs) ja osa neist funktsioonidest, mis on saadaval PostgreSQL 9.4. Nagu me nĂ€eme, on neid vĂ€ga palju. Ja ĂŒsna lihtne on segadusse minna, kui olete sellega esmakordselt kokku puutunud.

Kuid kui me vĂ”tame eelmist pilti Kuidas kulutatakse aega PostgreSQL-is ja sobitame selle nimekirjaga, siis saame sellise pildi. Iga vaade (VIEWs) vĂ”i iga funktsioon, mida saame kasutada erinevatel eesmĂ€rkidel, et saada vastavat statistikat siis, kui PostgreSQL on töös. Ja me saame juba mingit teavet alamsĂŒsteemi töö kohta.

Esimene, mida me vaadata hakkame, on pg_stat_database. Nagu me nÀeme, on see vaade. See sisaldab vÀga palju teavet. VÀga erinevat teavet. Ja see annab vÀga kasulikku arusaama sellest, mis meie andmebaasis toimub.
Mida kasulikku me sealt vÔtta saame? Alustame kÔige lihtsamatest asjadest.

select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;Esimene, mida me vaatame, on mÀÀr mĂ€ngude osakaal. MĂ€ngude osakaal â see on kasulik mÔÔdik. See vĂ”imaldab hinnata, kui palju andmeid saadakse jagatud puhversalvest, ja kui palju andmeid loetakse kettalt.
MĂ”istagi on mida rohkem on meil mĂ€ngude osakaalu, seda parem. Me hindame seda mÔÔdikut protsendina. Ja nĂ€iteks, kui meil on mĂ€ngude osakaal suurem kui 90%, siis see on hea. Kui see langeb alla 90%, siis tĂ€hendab, et meil pole piisavalt mĂ€lu, et hoida andmete âkuum peadâ mĂ€lus. Ja et neid andmeid kasutada, peab PostgreSQL pöörduma ketta poole, mis on aeglasem, kui andmeid loetakse mĂ€lust. Ja tuleb mĂ”elda mĂ€luta suurendamisele: kas suurendada jagatud puhver vĂ”i suurendada riistvaramĂ€lu (RAM).

select
datname,
(xact_commit*100)/(xact_commit+xact_rollback) as c_ratio,
deadlocks, conflicts,
temp_file, pg_size_pretty(temp_bytes) as temp_size
from pg_stat_database;Mida veel saab sellest vaatest vÔtta? Saame vaadata andmebaasis toimuvaid anomaaliaid. Mida siin nÀidatakse? Siin on commits, rollbacks, ajutiste failide loomine, nende maht, deadlocks ja konfliktid.
Me saame kasutada seda pĂ€ringut. See SQL on ĂŒsna lihtne. Ja saame vaadata neid andmeid enda juures.

Ja siin on kohe lÀvivÀÀrtused. Me vaatame commitide ja rollbackide suhet. Commits on eduka tehingu kinnitamine. Rollbacks on tagasivÔtmine, st tehing viis lÀbi mingi töö, koormas andmebaasi, tegi arvutusi, kuid seejÀrel tekkis rike ja tehingu tulemused jÀeti kÔrvale. St. rollbaki pidev suurenemine on halb. Ja peaksite neid vÀltima ning koodi muutma, et seda ei juhtuks.
Konflikid (conflicts) on seotud replikatsiooniga. Ja neid tuleks ka vĂ€ltida. Kui teil on pĂ€ringud, mis tĂ€idetakse replikas ja tekivad konfliktid, tuleb need konfliktid lahendada, vaadata, mis toimub. Ăksikasju saab leida logidest. Ja lahendada konfliktid, et rakenduse pĂ€ringud töötaksid ilma vigadeta.
Deadlock'id on samuti halb olukord. Kui pĂ€ringud vĂ”itlevad ressursside pĂ€rast, ĂŒks pĂ€ring pöördus ĂŒhe ressursi poole ja sai lukustuse, teine pĂ€ring pöördus teise ressursi poole ja sai samuti lukustuse, ja seejĂ€rel pöördusid mĂ”lemad pĂ€ringud ĂŒksteise ressursside poole ning lukustusid, oodates, kuni naaber vabastab lukustuse. See on samuti probleemne olukord. Need tuleb lahendada rakenduste ĂŒmberkirjutamise ja juurdepÀÀsu serialiseerimise tasandil. Ja kui nĂ€ete, et teie deadlock'id pidevalt suurenevad, tuleb logides vaadata ĂŒksikasju, lahendada tekkinud olukordi ja leida probleem.
Ajutised failid (temp_files) on samuti halb. Kui kasutaja pÀringule ei piisa mÀlu ajutiste, ajutiste andmete salvestamiseks, loob see kettale faili. Ja kÔik toimingud, mida ta vÔiks ajutises mÀlupuhvrisse teha, hakkavad toimuma juba kettal. See on aeglane. See suurendab pÀringu tÀitmise aega. Ja klient, kes saatis pÀringu PostgreSQL-ile, saab vastuse natuke hiljem. Kui kÔik need toimingud toimuksid mÀlus, vastaks Postgres palju kiiremini ja klient ootaks vÀhem.

Pg_stat_bgwriter on esitus, mis kirjeldab kahte PostgreSQL-i taustaprotsessi tööd: need on kontrollpunkt ja taustakirjutaja.

Alustame kontrollpunktidest, nn. kontrollpunktidest. Mis on kontrollpunktid? Kontrollpunkt on tehingu ĆŸurnalis olev positsioon, mis nĂ€itab, et kĂ”ik andmete muudatused, mis on registreeritud ĆŸurnalisse, on edukalt sĂŒnkroonitud andmetega kettas. Protsess vĂ”ib sĂ”ltuvalt töökoormusest ja seadistustest olla aeganĂ”udev ning see seisneb enamasti mÀÀrdunud lehtede sĂŒnkroonimises jagatud puhvris (shared buffers) andmefailidega kettas. Miks see vajalik on? Kui PostgreSQL pöördus pidevalt kettale andmete saamiseks ja salvestamiseks iga pĂ€ringu jaoks, oleks see aeglane. SeetĂ”ttu on PostgreSQL-l mĂ€lu segment, mille suurus sĂ”ltub seadistustest konfiguratsioonis. Postgres paigutab sellesse mĂ€llu töötavad andmed edasiseks töötlemiseks vĂ”i pĂ€ringute edastamiseks. Andmete muutmise pĂ€ringute puhul toimub nende muutmine. Saame kaks versiooni andmetest. Ăks on meil mĂ€lus, teine kettas. Ja perioodiliselt tuleb neid andmeid sĂŒnkroonida. Peame sĂŒnkroonima mĂ€lus muudetud andmed kettale. Selleks on vajalik checkpoint.
Checkpoint lĂ€bib jagatud puhvri (shared buffers), mĂ€rgib mÀÀrdunud lehed, mis on vajalikud kontrollpunktiks. Siis kĂ€ivitab ta teise lĂ€bimise jagatud puhvris. Ja lehed, mis on mĂ€rgitud kontrollpunktiks, sĂŒnkroonitakse. Nii toimub andmete sĂŒnkroniseerimine kettaga.
On kaks tĂŒĂŒpi kontrollpunkte. Ăks kontrollpunkt toimub ajautuse jĂ€rgi. See on kasulik ja hea kontrollpunkt - checkpoint_timed. Ja on ka nĂ”udmisel kontrollpunkte - checkpoint required. Selline kontrollpunkt toimub siis, kui meil toimub vĂ€ga suur andmete kirjutamine. Oleme kirjutanud vĂ€ga palju tehingu ĆŸurnaleid. Ja PostgreSQL arvab, et tal on vaja see kĂ”ik vĂ”imalikult kiiresti sĂŒnkroonida, teha kontrollpunkt ja edasi elada.
Ja kui vaatasite statistikat pg_stat_bgwriter ja nĂ€gite, et teil on checkpoint_req on palju suurem kui checkpoint_timed, siis on see halb. Miks halb? See tĂ€hendab, et PostgreSQL on pidevas stressisituatsioonis, kus tal on vaja andmeid kettale kirjutada. Ajautuse jĂ€rgi kontrollpunkt on vĂ€hem stressirohke ja toimub vastavalt sisemisele ajakavale, pikendatud ajavahemikuks. PostgreSQL-l on vĂ”imalus töö kĂ€igus pause teha ja mitte koormata kettaalust sĂŒsteemi. See on PostgreSQL-le kasulik. Ja pĂ€ringud, mis toimuvad kontrollpunkti ajal, ei tunne stressi, et kettasĂŒsteem on hĂ”ivatud.
Ja ja checkpoint'i reguleerimiseks on kolm parameetrit:
checkpoint_segments.checkpoint_timeout.checkpoint_completion_target.
Need vÔimaldavad reguleerida kontrollpunktide tööd. Kuid ma ei peatu nende peal pikalt. Nende mÔju on eraldi teema.
TĂ€helepanu: Arutatud ettekande versioon 9.4 on juba aegunud. Kaasaegsetes PostgreSQL versioonides on parameeter checkpoint_segments asendatud parameetritega min_wal_size ja max_wal_size.

JĂ€rgmine alamsĂŒsteem on taustakirjutaja â taustakirjutaja. Mida ta teeb? Ta töötab pidevalt lĂ”putus silmuses. Skaneerib lehti jagatud mĂ€lupuhvrid ja logib lehed, mis on mustad, diskile. Nii aitab ta checkpointer'il teha vĂ€hem tööd kontrollpunktide tĂ€itmise ajal.
Milleks ta veel vajalik on? Ta tagab vajaduse puhaste lehtede jĂ€rele jagatud mĂ€lupuhvrid, juhul kui need Ă€kki on vajalikud (suurtes kogustes ja korraga) andmete paigutamiseks. Oletame, et on tekkinud olukord, kus pĂ€ringu tĂ€itmiseks on vaja puhtaid lehti ja need on juba jagatud mĂ€lupuhvrid. PostgreSQL backend lihtsalt vĂ”tab need ja kasutab, tal ei ole vaja ise midagi puhastada. Kuid kui Ă€kki ei ole selliseid lehti, peatab backend töö ja hakkab otsima lehti, et need diskile logida ja oma vajaduste jaoks vĂ”tta â mis mĂ”jutab negatiivselt hetkel tĂ€ituvat pĂ€ringu aega. Kui nĂ€ete, et teie parameeter maxwritten_clean on suur, tĂ€hendab see, et taustakirjutaja ei tule oma tööga toime ja parameetreid tuleks suurendada bgwriter_lru_maxpages, et ta saaks ĂŒhe silmuse ajal rohkem tööd teha ja rohkem lehti puhastada.
Ja teine vĂ€ga kasulik nĂ€itaja on buffers_backend_fsync. Backendid ei tee fsync'i, sest see on aeglane. Nad edastavad fsync'i ĂŒles IO stack checkpointer'ile. Checkpointer'il on oma jĂ€rjekord, ta töötleb aeg-ajalt fsync'i ja sĂŒnkroniseerib mĂ€lu lehed failidega diskil. Kui checkpointer'il on suur ja tĂ€idetud jĂ€rjekord, on backend sunnitud ise tegema fsync'i ja see aeglustab backend'i tööd, st klient saab vastuse hiljem, kui vĂ”iks. Kui nĂ€ete, et teie vÀÀrtus on suurem kui null, siis on see juba probleem ja peate pöörama tĂ€helepanu taustakirjutaja seadistustele ja samuti hindama diskiallikate jĂ”udlust.

TÀhelepanu: _JÀrgmine tekst kirjeldab statistilisi esitusi, mis on seotud replikatsiooniga. Enamik esinduste ja funktsioonide nimesid muudeti Postgres 10-s. Muudatuste olemus seisnes asendamises xlog . Tundub, et wal ja asukoht . Tundub, et lsn funktsioonide/ettepanekute nimedes jne. Konkreetne nÀide, funktsioon pg_xlog_location_diff() muudeti nimeks pg_wal_lsn_diff()._
Siin on meil samuti palju asju. Kuid vajadus on vaid punktide jÀrele, mis on seotud asukohaga.

Kui me nÀeme, et kÔik vÀÀrtused on vÔrdsed, on see ideaalne olukord ja replikatsioon ei jÀÀ meistrist maha.
See kuusakoodipositsioon on positsioon tehingute logis. See suureneb pidevalt, kui andmebaasis on mingit tegevust: lisamine, kustutamine jne.

kui palju xlog-i on kirjutatud baitides
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
replikatsiooni viivitus baitides
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
replikatsiooni viivitus sekundites
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());Kui need asjad erinevad, tÀhendab see, et on mingi viivitus. Viivitus on replikatsiooni mahajÀÀmus meistrist, st andmed erinevad serverite vahel.
On kolm viivituse pÔhjust:
- See on kettasĂŒsteem, mis ei suuda faile sĂŒnkroonimise kirjutamisel hakkama saada.
- Need vĂ”ivad olla vĂ”rgu vead vĂ”i vĂ”rgu ĂŒlekoormus, kui andmed ei jĂ”ua replikatsiooni ja see ei suuda neid taastada.
- Ja protsessor. Protsessor on vÀga harv juhtum. Olen seda nÀinud kaks vÔi kolm korda, kuid see vÔib siiski juhtuda.
Ja siin on kolm pÀringut, mis vÔimaldavad meil kasutada statistikat. Saame hinnata, kui palju on meie tehingute logis kirjutatud. Selleks on olemas funktsioon pg_xlog_location_diff ja saame hinnata replikatsiooni viivituse baitides ja sekundites. Kasutame ka selleks vÀÀrtust sellest esitusest (VIEWs).
MĂ€rkus: _pg_xlog_location diff() funktsiooni asemel saab kasutada lahutamise operaatorit ja lahutada ĂŒhe asukoha teisest. See on mugav.Sekundites oleva viivituse puhul on ĂŒks hetk. Kui meistril ei toimu mingit tegevust, oli tehing kuskil 15 minutit tagasi ja mingit aktiivsust ei toimu, ja kui me vaataksem selle replikatsiooni viivitust, siis nĂ€eme 15-minutilist viivitust. Sellest tasub meeles pidada. See vĂ”ib segadusse ajada, kui olete seda viivitust vaadanud.
Sekundites oleva mahajÀÀmuse osas on ĂŒks moment. Kui masteris ei toimu mingit tegevust, olid tehingud umbes 15 minutit tagasi ja aktiivsust ei ole, ning kui vaatasime seda mahajÀÀmust replikas, siis nĂ€eme 15-minutilist mahajÀÀmust. Seda tasub meeles pidada. See vĂ”ib tuua segadusse, kui vaatate seda mahajÀÀmust.

Pg_stat_all_tables â veel kasulik vaade. See nĂ€itab statistikat tabelite kohta. Kui meie andmebaasis on tabelid ja nende suhtes toimub mingit tegevust, saame selle teabe sellest vaatest.

select
relname,
pg_size_pretty(pg_relation_size(relname::regclass)) as size,
seq_scan, seq_tup_read,
seq_scan / seq_tup_read as seq_tup_avg
from pg_stat_user_tables
where seq_tup_read > 0 order by 3,4 desc limit 5;Esimene asi, mida saame vaadata, on jÀrjestikused skaneeringud tabeli kohta. Number, mis nende kÀikude jÀrel tuleb, ei pruugi veel tingimata halb olla ega ole nÀitaja, et peaksime midagi ette vÔtma.
Siiski on teine mÔÔdik â seq_tup_read. See on ridade arv, mis tagastatakse jĂ€rjestikuste skaneerimiste tulemusena. Kui keskmine arv ĂŒletab 1 000, 10 000, 50 000, 100 000, siis on see juba nĂ€itaja, et vĂ”ib-olla on teil vaja kuhugi indeks luua, et pĂ€ringud toimuksid indeksi kaudu, vĂ”i vĂ”ib-olla optimeerida pĂ€ringuid, mis selliseid jĂ€rjestikulisi skaneerimisi kasutavad, et seda vĂ€ltida.
Lihtne nĂ€ide â oletame, et pĂ€ring sisaldab suurt OFFSET'i ja LIMIT'i. NĂ€iteks skaneeritakse tabelis 100 000 rida ja seejĂ€rel valitakse 50 000 vajalikku rida, samas kui eelnevalt skaneeritud read tĂ”rjutakse kĂ”rvale. See on samuti halb juhtum ja selliseid pĂ€ringuid tuleb optimeerida. Siin on selline lihtne SQL-pĂ€ring, mille abil saab seda vaadata ja saadud numbreid hinnata.

select
relname,
pg_size_pretty(pg_total_relation_size(relname::regclass)) as
full_size,
pg_size_pretty(pg_relation_size(relname::regclass)) as
table_size,
pg_size_pretty(pg_total_relation_size(relname::regclass) -
pg_relation_size(relname::regclass)) as index_size
from pg_stat_user_tables
order by pg_total_relation_size(relname::regclass) desc limit 10;Tabelite suurused on samuti saadaval selle tabeli ja tÀiendavate funktsioonide abil. pg_total_relation_size(), pg_relation_size().
Ăldiselt on olemas meta-komandod dt ja di, mida saab kasutada PSQL-is ning samuti vaadata tabelite ja indeksite suurusi.
Kuid funktsioonide kasutamine aitab meil vaadata tabelite suurusi ka koos indeksitega vÔi ilma ja teha juba teatud hinnanguid andmebaasi kasvamise kohta, st kui intensiivselt see kasvab ning teha jÀreldusi suuruste optimeerimise kohta.

Kirjutamisaktiivsus. Mis on kirjutamine? Vaatame operatsiooni UPDATE â ridade ridade uuendamise operatsioon. Sisuliselt on update kaks operatsiooni (ja vĂ”ib-olla isegi rohkem). See on uue ridade versiooni sisestamine ja vana ridade versiooni mĂ€rkimine kui aegunud. Hiljem tuleb autovakuum ja need aegunud versioonid eemaldatakse, mĂ€rkides selle koha ĂŒmberkasutatavaks.
Lisaks ei ole update vaid tabeli uuendamine. See on ka indeksite uuendamine. Kui tabelil on palju indekse, tuleb update'i korral uuendada ka kÔik indeksi, milles osaleb pÀringu kaudu uuendatud vÀljad. Nendes indeksites on samuti aegunud versioonid, mis tuleb puhastada.

select
s.relname,
pg_size_pretty(pg_relation_size(relid)),
coalesce(n_tup_ins,0) + 2 * coalesce(n_tup_upd,0) -
coalesce(n_tup_hot_upd,0) + coalesce(n_tup_del,0) AS total_writes,
(coalesce(n_tup_hot_upd,0)::float * 100 / (case when n_tup_upd > 0
then n_tup_upd else 1 end)::float)::numeric(10,2) AS hot_rate,
(select v[1] FROM regexp_matches(reloptions::text,E'fillfactor=(\d+)') as
r(v) limit 1) AS fillfactor
from pg_stat_all_tables s
join pg_class c ON c.oid=relid
order by total_writes desc limit 50;Ja oma disaini tĂ”ttu on UPDATE â see on raska operatsioon. Kuid neid saab kergendada. On kuumad uuendused. Need ilmusid PostgreSQL versioonis 8.3. Mis need siis on? Need on kerged uuendused, mis ei pĂ”hjusta indeksite ĂŒmberkujundamist. St me uuendame kirje, kuid seejĂ€rel uuendatakse ainult kirje lehel (mis kuulub tabelisse), samas kui indeksid viitavad endiselt sellele samale kirjele lehel. Seal on veidi huvitav loogika, kuidas vakkuum töötab, siis see kohandab neid ahelikke kuumad ja kĂ”ik töötab edasi ilma indeksite uuendamiseta, ning see toimub vĂ€iksemate ressursikuludega.
Ja kui teil on n_tup_hot_upd suured, siis see on vĂ€ga hea. See tĂ€hendab, et kerged uuendused domineerivad ja see on ressursikĂŒsimisena meile odavam ja kĂ”ik on suurepĂ€rane.

ALTER TABLE table_name SET (fillfactor = 70);Kuidas suurendada kuumade uuendustemahtu? Saame kasutada fillfactor. See mÀÀrab, kui suur on reserveeritud vabade kohtade suurus tabeli lehe tĂ€itmisel INSERT-dega. Kui tabelisse tulevad sisestused, tĂ€idavad nad tĂ€ielikult lehe, jĂ€ttes sinna tĂŒhja ruumi. Siis mÀÀratakse uus leht. JĂ€lle andmed tĂ€idetakse. Ja see kĂ€itumine on vaikimisi, fillfactor = 100%.
Me saame seadistada fillfactor'i 70%. See tÀhendab, et insertide korral eraldub uus leht, kuid seda tÀidetakse vaid 70% ulatuses. 30% jÀÀb meile reserviks. Kui tuleks teha uuendus, toimub see tÔenÀoliselt samal lehel ja uue rea versioon paigutatakse samasse lehte. Tehakse kuum uuendus. Nii lihtsustatakse tabelites kirjutamist.

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));Autovacuumi ootejĂ€rjekord. Autovacuum on selline alam-sĂŒsteem, mille statistika PostgreSQLis on vĂ€ga vĂ€hene. Me saame tabelites ainult pg_stat_activity's nĂ€ha, kui palju meie vacuum'e praegu kestab. Siiski on raske mĂ”ista, kui palju tabeleid on tal jĂ€rjekorras.
MĂ€rkus: _Postgres 10 versioonist alates on autovacuum'i jĂ€lgimise olukord mĂ€rgatavalt paranenud - lisandunud on pg_stat_progress vaade.vacuum, mis oluliselt lihtsustab autovacuum'i jĂ€lgimise kĂŒsimust.
Me saame kasutada sellist lihtsustatud pĂ€ringut. Ja vĂ”ime vaadata, millal peaks vacuum toimuma. Kuid kuidas ja millal peaks vacuum kĂ€ivituma? Need vananenud ridade versioonid, millest ma rÀÀgin. Uuendus toimus, uus rea versioon lisati. Ilmus vananenud rea versioon. Tabelis pg_stat_user_tables on olemas selline parameeter n_dead_tup. See nĂ€itab "surnud" ridade arvu. Ja niipea, kui surnud ridade arv ĂŒletab teatud piiri, tuleb tabelis autovacuum.
Kuidas seda piiri arvutatakse? See on ĂŒsna konkreetne protsentuaalne suhe tabelis olevate ridade koguarvust. On olemas parameeter autovacuum_vacuum_scale_factor. See mÀÀrab protsentuaalse suhte. Oletame, et 10% + seal on tĂ€iendav baaspatassee 50 rida. Mis juhtub? Kui meie surnud ridade arv ĂŒletab "10% + 50" kogu tabeli ridadest, paneme tabeli autovacuum'i.

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));Siiski on ĂŒks punkt. Baaspiirangud parameetritele av_base_thresh ja av_scale_factor vĂ”ivad olla mÀÀratud individuaalselt. Seega ei ole kĂŒnnis ĂŒldine, vaid individuaalne tabeli jaoks. SeetĂ”ttu on arvutamiseks vaja kasutada trikke ja nĂ€punĂ€iteid. Ja kui teid huvitab, siis vĂ”ite vaadata meie kolleegide kogemusi Avitos (link slaidil ei kehti ja on tekstis uuendatud).
Nad kirjutasid , mis arvestab neid aspekte. Seal on kahesugune leht. Kuid loendamine toimub Ôigesti ja see vÔimaldab tÔhusalt hinnata, kus meil on palju vaakume, kus vÀhe.
Mida me saame sellega teha? Kui meil on suur jĂ€rjekord ja automaatne vaakum ei suuda sellega toime tulla, saame suurendada vaakumitöötajate arvu vĂ”i lihtsalt teha vaakumi agressiivsemaks, et see kĂ€ivituks varem ja töötleks tabelit vĂ€ikeste tĂŒkkidena. Nii et jĂ€rjekord vĂ€heneb. â Peamine on siin jĂ€lgida kettakoormust, kuna vaakum on tasuta asi, kuigi SSD/NVMe seadmete kasutuselevĂ”tuga on probleem muutunud vĂ€hem nĂ€htavaks.

Pg_stat_all_indexes â see on statistika indeksite kohta. See on vĂ€ike. Ja me saame selle pĂ”hjal teavet indeksite kasutamise kohta. Ja nĂ€iteks saame mÀÀrata, millised indeksid on meile ĂŒleliigsed.

Nagu ma juba ĂŒtlesin, update â see ei ole ainult tabelite vĂ€rskendamine, vaid ka indeksite vĂ€rskendamine. Seega, kui meil on tabelis palju indekseid, peab tabeli ridade vĂ€rskendamisel ka indeksitud vĂ€ljade indekseid vĂ€rskendama, ja kui meil on kasutamata indeksid, mille jaoks ei ole indeksiskeeme, siis nad jÀÀvad meile ballastiks. Ja neist on vaja lahti saada. Selleks on meil vaja vĂ€lja idx_scan. Lihtsalt vaatame indeksiskeemide arvu. Kui indeksitel ei ole analĂŒĂŒse pika statistika hoidmise perioodi (mitte vĂ€hem kui 2-3 nĂ€dalat) jooksul, siis on tĂ”enĂ€oliselt tegemist halva indeksiga, millest peame lahti saama.
MÀrkus: Kasutamata indeksite otsimisel voolureplikaatori klastrite puhul on vajalik kontrollida kÔiki klastrite sÔlmi, kuna statistika ei ole globaalne, ja kui indeksit ei kasutata meistris, vÔib see olla kasutusel koopiatel (kui seal on koormust).
Kaks linki:
Need on edasijÔudnumad nÀidised pÀringutest, kuidas leida kasutamata indekseid.
Teine link on ĂŒsna huvitav pĂ€ring. Seal on vĂ€ga ebatavaline loogika. Soovitan seda tutvumiseks.

Mida veel kokku vÔtta indeksite kohta?
Kasuta ĂŒlemÀÀraseid indekseid ei ole hea.
Need vÔtavad ruumi.
Need aeglustavad uuendamise operatsioone.
See on liigne töö mahus.
Kui me eemaldasime kasutamata indeksid, siis teeme andmebaasi ainult paremaks.

JĂ€rgmine esitus on pg_stat_activity. See on PostgreSQLâi utiliidi ps, ainult PostgreSQLâis. Kui pste vaatate protsesse operatsioonisĂŒsteemis, siis pg_stat_activity nĂ€itab aktiivsust PostgreSQLâis.
Mida me sealt kasulikku saame?

select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;Me saame vaadata ĂŒldist aktiivsust, mis andmebaasis toimub. Saame teha uue juurutuse. Meil on seal kĂ”ik plahvatanud, uusi ĂŒhendusi ei vĂ”eta, rakenduses visatakse vigu.

select
client_addr, usename, datname, count(*)
from pg_stat_activity group by 1,2,3 order by 4 desc;Saame teha sellise pĂ€ringu ja vaadata, kui suur on ĂŒhenduste ĂŒldprotsent maksimaalsest ĂŒhenduste piirist ning vaadata, kes meie juures kĂ”ige rohkem ĂŒhendusi kasutab. Antud juhul nĂ€eme, et kasutaja cron_role avaldas 508 ĂŒhendust. Ja tema kohta on midagi toimunud. Tuleb temaga tegeleda ja vaadata. On tĂ€iesti vĂ”imalik, et see on mingi ebanormaalne ĂŒhenduste arv.

Kui meil on OLTP koormus, peavad pĂ€ringud toimuma kiiresti, vĂ€ga kiiresti ja pikad pĂ€ringud ei ole lubatud. Kuid kui tekivad pikad pĂ€ringud, siis lĂŒhiajaliselt pole hullu, kuid pikaajalises perspektiivis kahjustavad pikad pĂ€ringud andmebaasi, need suurendavad tabelite Ă€raoleva efekti, kui tabelid fragmenteeruvad. Ja nii Ă€raolevast kui ka pikkadest pĂ€ringutest tuleb vabaneda.

select
client_addr, usename, datname,
clock_timestamp() - xact_start as xact_age,
clock_timestamp() - query_start as query_age,
query
from pg_stat_activity order by xact_start, query_start;Pange tÀhele: selle pÀringuga saame tuvastada pikad pÀringud ja tehingud. Kasutame funktsiooni clock_timestamp() töötamise aja mÀÀramiseks. Pikad pÀringud, mille leidime, saame salvestada, teostada explain, vaadata plaane ja kuidagi optimeerida. Kaasnevad pikad pÀringud lakkame ja elame edasi.

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';Halvad tehingud on tehingud, mis on idle in transaction ja idle in transaction (aborted) olekus.
Mida see tĂ€hendab? Tehingutel on mitu olekut. Ja ĂŒks neist olekutest vĂ”ib olla mis tahes ajahetkel. Oleku mÀÀramiseks on siin kasutusel vĂ€li state selles esituses. Ja me kasutame seda oleku mÀÀramiseks.

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';Ja nagu juba varem mainitud, need kaks olekut idle in transaction ja idle in transaction (aborted) â see on halb. Mis see on? See on siis, kui rakendus avas tehingu, tegi mingid toimingud ja lĂ€ks oma asjadega edasi. Tehing jĂ€i avatuks. See ripub, selles ei toimu midagi, see kasutab ĂŒhendust, blokeeringud muudetud ridadele ja potentsiaalselt suurendab ka teiste tabelite bloat'i, Postgres'i tehingu mootori arhitektuuri tĂ”ttu. Selliseid tehinguid tuleb samuti elimineerida, sest need on igal juhul kahjulikud.
Kui nÀete, et neid on teie andmebaasis rohkem kui 5-10-20, siis tuleb hakata muretsema ja midagi ette vÔtma.
Siin kasutame samuti aja arvutamiseks clock_timestamp(). Elimineerime tehingud, optimeerime rakendust.

Kuidas juba varem mainitud, blokeeringud â need on siis, kui kaks vĂ”i enam tehingut konkureerivad ĂŒhe vĂ”i grupi ressursside pĂ€rast. Selleks on meil vĂ€ljad waiting boolean vÀÀrtusega true vĂ”i false.
True â see tĂ€hendab, et protsess ootab, midagi peab tegema. Kui protsess on ootel, tĂ€hendab see, et ka klient, kes selle protsessi kĂ€ivitas, ootab. Klient brauseris istub ja ootab samuti.
TÀhelepanu: _Alates Postgres versioonist 9.6 on vÀli waiting eemaldatud ja selle asemel on lisatud kaks informatiivsemat vÀlja wait_event_type ja wait_event._

Mida teha? Kui nÀete true pikka aega, tÀhendab see, et sellistest pÀringutest tuleb vabaneda. Me lihtsalt elimineerime sellised tehingud. Arendajatele kirjutame, et nad peaksid kuidagi optimeerima, et ressursi jÀrele ei tekiks vÔistlust. Edasi arendajad optimeerivad rakendust, et selliseid olukordi ei esineks.
Ja viimane, kuid potentsiaalselt mitte fatidne olukord â see on deadlock'ide tekkimine. Kaks tehingut uuendavad kahte ressurssi, seejĂ€rel pöörduvad uuesti nende poole, juba vastandlikele ressurssidele. PostgreSQL vĂ”tab sel juhul ette ja elimineerib tehingu, et teine saaks tööd jĂ€tkata. See on ummik ja see ei lahene iseenesest. SeetĂ”ttu peab PostgreSQL vĂ”tma ÀÀrmuslikud meetmed.

Ja need on kaks pÀringut, mis vÔimaldavad blokeeringute jÀlgimist. Me kasutame esitust pg_locks, mis vÔimaldab jÀlgida suuri lukustusi.
Ja esimene link â see on pĂ€ringu tekst. See on ĂŒsna pikk.
Ja teine link â see on artikkel lukustuste kohta. Seda on kasulik lugeda, see on vĂ€ga huvitav.
Nii et, mida me nĂ€eme? Me nĂ€eme kahte pĂ€ringut. Tehingut koos ALTER TABLE â see on blokeeriv tehing. See kĂ€ivitati, kuid ei lĂ”petatud ja rakendus, mis selle tehingu kĂ€ivitas, tegeleb praegu teiste asjadega. Ja teine pĂ€ring â uuendus. See ootab, kuni ALTER TABLE lĂ”petab, et jĂ€tkata oma tööd.
Nii saame vÀlja selgitada, kes kedagi lukustas, hoiab ja saame sellega edasi tegeleda.

JĂ€rgmine moodul â see on pg_stat_statements. Nagu ma juba ĂŒtlesin, see on moodul. Selleks, et seda kasutada, tuleb laadida selle teegi konfiguratsioonis, taaskĂ€ivitada PostgreSQL, installida moodul (ĂŒhe kĂ€suga) ja siis on meil uus vaade.

Keskmine pÀringu aeg millisekundites
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;
KÔige aktiivsemad kirjutavad (shared_buffers) pÀringud
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;Mida me sealt vÔtta saame? Kui rÀÀkida lihtsatest asjadest, siis saame keskmise pÀringu tÀitmise aja vÔtta. Aeg kasvab, tÀhendab, et meie PostgreSQL vastab aeglaselt ja tuleb midagi ette vÔtta.
Saame vaadata kÔige aktiivsemaid kirjutavaid tehingute andmebaasis, mis muudavad andmeid shared buffers. Vaadata, kes meil seal andmeid uuendab vÔi kustutab.
Ja saame lihtsalt vaadata erinevat statistikat nende pÀringute kohta.

Meie pg_stat_statements kasutame aruannete koostamiseks. Kord pÀevas kustutame statistika. Kogume seda. Enne jÀrgmise kord statistika kustutamist koostame aruande. Siin on link aruandele. Sa saad seda vaadata.

Mida me teeme? Me arvestame kogu statistika kÔigi pÀringute kohta. SeejÀrel arvutame iga pÀringu individuaalse panuse sellesse kogustatistikasse.
Ja mida me saame vaadata? Saame vaadata kĂ”igi konkreetse tĂŒĂŒbi pĂ€ringute kogumisaega kĂ”igi teiste pĂ€ringute taustal. Saame vaadata protsessori ja sisendi- ja vĂ€ljundiressursside kasutamist suhtes ĂŒldisele pildile. Ja saame juba neid pĂ€ringuid optimeerida. Koostame selle aruande pĂ”hjal top pĂ€ringud ja juba saame mĂ”tteainet, mida optimeerida.

Mida meil kaadrivÀliselt jÀi? JÔudis veel paar esitlust, mida ma ei hakanud kÀsitlema, kuna aeg on piiratud.
Jah pgstattuple â see on samuti tĂ€iendav moodul tavalises contrib paketis. See vĂ”imaldab hinnata bloat tabelite, nn tabelifragmentatsiooni. Ja kui fragmentatsioon on suur, tuleb see eemaldada, kasutades erinevaid tööriistu. Ja funktsioon pgstattuple töötab kaua. Ja mida rohkem tabeleid, seda kauem see töötab.

JĂ€rgmine contrib on pg_buffercache. See vĂ”imaldab teha ĂŒlevaate jagatud puhverest: kui intensiivselt ja milliste tabelite jaoks kasutatakse puhvri lehti. Ja lihtsalt vĂ”imaldab piiluda jagatud puhvri sisse ja hinnata, mis seal toimub.
JĂ€rgmine moodul â see on pgfincore. See vĂ”imaldab teha madala taseme toiminguid tabelitega sĂŒsteemikutsungi kaudu mincore(), st see vĂ”imaldab laadida tabeli jagatud puhvrites vĂ”i selle vĂ€lja laadida. Ja lisaks vĂ”imaldab see teha sĂŒsteemi lehekĂŒlje vahemĂ€lu ĂŒlevaate, st millises mahus meie tabel on lehe vahemĂ€lus, jagatud puhvrites ja lihtsalt hinnata tabeli koormust.
JĂ€rgmine moodul on pg_stat_kcache. See kasutab samuti sĂŒsteemikutsungit getrusage(). Ja tĂ€idab selle enne ja pĂ€rast pĂ€ringu tĂ€itmist. Ja saadud statistikas vĂ”imaldab hinnata, kui palju meie pĂ€ring kulutas kettajuurdepÀÀsu jaoks, st operatsioone failisĂŒsteemiga ja vaatab protsessori kasutamist. Kuid moodul on noor (ahem-ahem) ja oma tööks nĂ”uab PostgreSQL 9.4 ja pg_stat_statements, millest ma varem rÀÀkisin.

Statistika kasutamine on kasulik. Teie ei vaja kolmandate osapoolte programme. Te saate ise piiluda, vaadata, midagi teha, ellu viia.
Statistika kasutamine ei ole keeruline, see on tavaline SQL. Te koondete pÀringu, koostate selle, saadate, vaatate.
Statistika aitab vastata kĂŒsimustele. Kui teil tekivad kĂŒsimused, pöördute statistika poole â vaatate, teete jĂ€reldusi, analĂŒĂŒsite tulemusi.
Ja katsetage. PÀringuid on palju, andmeid on palju. Alati on vÔimalik optimeerida mÔnda olemasolevat pÀringut. Saate teha oma versiooni pÀringust, mis sobib teile rohkem kui originaal ja kasutada seda.

Viidatud lingid
Head lingid, mis esitusel esinesid, pÔhinevad artiklitel, millest oli raport.
Autor kirjutab veel
(eng)
Statistika Kogujad
SĂŒsteemi Haldamise Funktsioonid
Contrib moodulid
SQL utiliidid ja sql koodi nÀited
AitÀh kÔigile tÀhelepanu eest!
Allikas: habr.com
