Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Pool aastat tagasi esitlesime explain.tensor.ru — avalikku teenust pĂ€ringute plaanide analĂŒĂŒsimiseks ja visualiseerimiseks PostgreSQL-ile.

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Viimase kuue kuu jooksul tegime sellest ettekande PGConf.Russia 2020-l, koostasime ĂŒldistava artikli SQL-pĂ€ringute kiirusest soovituste pĂ”hjal, mida see annab... kuid kĂ”ige tĂ€htsam on, et kogusime teie tagasisidet ja jĂ€lgisime tegelikke kasutusjuhtumeid.

Ja nĂŒĂŒd oleme valmis rÀÀkima uutest vĂ”imalustest, millest saate kasu lĂ”igata.

Erinevate plaaniformaatide tugi

Plaan logist koos pÀringuga

Valime otse konsoolist terve ploki, alates reast, millel on Query Text, koos kĂ”igi juhtivate tĂŒhikutega:

        Query Text: INSERT INTO dicquery_20200604 VALUES ($1.*) ON CONFLICT (query) DO NOTHING;
                           Insert on dicquery_20200604 (cost=0.00..0.05 rows=1 width=52) (actual time=40.376..40.376 rows=0 loops=1)
          Conflict Resolution: NOTHING
          Conflict Arbiter Indexes: dicquery_20200604_pkey
          Tuples Inserted: 1
          Conflicting Tuples: 0
          Buffers: shared hit=9 read=1 dirtied=1
          -> Result (cost=0.00..0.05 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=1)


 ja viskame kÔik kopeeritud otse plaani vÀlja, midagi ei jagades:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

LĂ”pptulemusena saame boonuseks analĂŒĂŒsitud plaanile veel ka vahekaardi „kontekst”, kus meie pĂ€ring on esitatud oma tĂ€ies ilus:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

JSON ja YAML

EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM pg_class;

"[
  {
    "Plan": {
      "Node Type": "Seq Scan",
      "Parallel Aware": false,
      "Relation Name": "pg_class",
      "Alias": "pg_class",
      "Startup Cost": 0.00,
      "Total Cost": 1336.20,
      "Plan Rows": 13804,
      "Plan Width": 539,
      "Actual Startup Time": 0.006,
      "Actual Total Time": 1.838,
      "Actual Rows": 10266,
      "Actual Loops": 1,
      "Shared Hit Blocks": 646,
      "Shared Read Blocks": 0,
      "Shared Dirtied Blocks": 0,
      "Shared Written Blocks": 0,
      "Local Hit Blocks": 0,
      "Local Read Blocks": 0,
      "Local Dirtied Blocks": 0,
      "Local Written Blocks": 0,
      "Temp Read Blocks": 0,
      "Temp Written Blocks": 0
    },
    "Planning Time": 5.135,
    "Triggers": [
    ],
    "Execution Time": 2.389
  }
]"

Oli see siis vĂ€liste jutumĂ€rkidega, nagu kopib pgAdmin, vĂ”i ilma — viskame samasse vĂ€ljasse, tulemuseks — ilu:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

TĂ€psem visualiseerimine

Planeerimise aeg / TĂ€itmise aeg

NĂŒĂŒd on paremini nĂ€ha, kuhu kadus lisakĂ€itumise aeg pĂ€ringu tĂ€itmises:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

I/O ajastus

MÔnikord tuleb kokku puutuda olukorraga, kus plaanis ei tundunud kurte, kuid tÀitmise aeg oli mingil moel ebanormaalselt pikk.

Siis tuleb öelda: "Oh, ilmselt oli sel hetkel serveri kett liiga koormatud, seetÔttu luges nii kaua!" Kuid see ei ole just kÔige tÀpsem...

Kuid seda on vÔimalik kindlalt mÀÀrata. Asi on selles, et PG-serveri konfiguratsiooni valikute hulgas on track_io_timing:

Sisaldab sisendi/vĂ€ljundi operatsioonide aja mÔÔtmist. See parameeter on vaikimisi vĂ€lja lĂŒlitatud, kuna selleks on vajalik pidev hetkeaja pĂ€rimine operatsioonisĂŒsteemilt, mis vĂ”ib mĂ”nel platvormil tööprotsessi oluliselt aeglustada. Ajakulu mÔÔtmise hindamiseks oma platvormil saate kasutada tööriista pg_test_timing. Sisendi/vĂ€ljundi statistikat saab kĂ€tte vaate pg_stat_database kaudu, EXPLAIN vĂ€ljundis (kui kasutate parameetrit BUFFERS) ja vaate pg_stat_statements kaudu.

Seda parameetrit saab aktiveerida ka kohaliku sessiooni raames:

SET track_io_timing = TRUE;

NĂŒĂŒd on aga parim osa — oleme Ă”ppinud neid andmeid mĂ”istma ja kuvama, arvestades kĂ”iki tĂ€itmispuu transformaate:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Siit on nÀha, et 0.790 ms kogu tÀitmisajast lÀks 0.718 ms andmelehe lugemiseks, 0.044 ms selle kirjutamiseks, ning kogu muu kasulik tegevus kestis vaid 0.028 ms!

Tulevik PostgreSQL 13-ga

Kogu uuenduste ĂŒlevaate leiate ĂŒhelt pĂ”hjalikult kirjutatud artiklilt, kuid rÀÀgime tĂ€psemalt plaanide muudatustest.

Planeerimise bufrid

Ressursside arvestamine, mis on mÀÀratud planeerijale, kajastub veel ĂŒhes paranduses, mis ei kuulu pg_stat_statements alla. EXPLAIN variant BUFFERS nĂ€itab, kui palju bufreid kasutati planeerimise etapis:

 Seq Scan on pg_class (tegelikud read=386 silmus=1)
   Buffers: shared hit=9 loetud=4
 Planeerimise aeg: 0.782 ms
   Buffers: shared hit=103 loetud=11
 TĂ€itmise aeg: 0.219 ms

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Inkrementaalne sortimine

Juhtudel, mil on vajalik sortimine mitme vĂ”tme jĂ€rgi (k1, k2, k3
), saab planeerija nĂŒĂŒd kasutada teadlikkust sellest, et andmed on juba sorteeritud mitme esialgse vĂ”tme jĂ€rgi (nĂ€iteks k1 ja k2). Sel juhul ei ole vaja kogu andmemassi uuesti sorteerida, vaid jagada see jĂ€rjestikusteks gruppideks ĂŒhesuguste k1 ja k2 vÀÀrtustega ning „dosoortida“ vĂ”tme k3 jĂ€rgi.

Nii jaguneb kogu sortimine mitmeks jÀrjestikuseks vÀiksema mahuga sortimiseks. See vÀhendab vajaliku mÀlu mahtu, lisaks vÔimaldab see esimesed andmed vÀlja anda varem, kui kogu sortimine on tÀielikult lÔpule viidud.

 Inkrementaalne sort (tegelikud read=2949857 silmus=1)
   SortimisvÔti: ticket_no, passenger_id
   Eelsorteeritud vÔti: ticket_no
   TĂ€is-sortimised: 92184 Sortimismeetod: quicksort MĂ€lu: avg=31kB tipp=31kB
   ->  Indeksi skaneerimine kasutades tickets_pkey tickete peal (tegelikud read=2949857 silmus=1)
 Planeerimise aeg: 2.137 ms
 TĂ€itmise aeg: 2230.019 ms

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini
Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

UI/UX tÀiustused.

Kuvapildid, need on igal pool!

NĂŒĂŒd on igas sakkides vĂ”imalik kiiresti sakkide ekraanipilt vĂ”tta lĂ”ikelauale saka kogu laiuse ja sĂŒgavuse ulatuses — „sihtmĂ€rgiga“ paremal ĂŒlal:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Tegelikult on enamik pilte selle avaldamise jaoks saadud just nii.

Soovitused sÔlmedes

Neid on mitte ainult rohkem, vaid igaĂŒhe kohta on ka vĂ”imalik pĂ”hjalikult lugeda artiklis, minnes lingile:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Arhiivist kustutamine

MĂ”ned palusid vĂ€ga lisada vĂ”imalus kustutada „tĂ€iesti“ isegi arhiivis mitte avaldatud plaane — palun, piisab vastava ikooni vajutamisest:

Me mÔistame PostgreSQL pÀringute plaane veelgi paremini

Noh, ja Àrge unustage, et meil on toetustiim, kuhu saab kirjutada oma mÀrkusi ja ettepanekuid.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster