PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Puoli vuotta sitten esittelimme selittää.tensor.ru - julkinen palvelu kyselysuunnitelmien jäsentämiseen ja visualisointiin PostgreSQL:ään.

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Viime kuukausina olemme tehneet hänestä raportti PGConf.Russia 2020 -tapahtumassa, laati yhteenvedon artikkeli SQL-kyselyiden nopeuttamisesta sen antamien suositusten perusteella... mutta mikä tärkeintä, keräsimme palautteesi ja tarkastelimme todellisia käyttötapauksia.

Ja nyt olemme valmiita kertomaan sinulle uusista ominaisuuksista, joita voit käyttää.

Tuki eri suunnitelmamuotoille

Suunnitelma lokista pyynnön mukana

Valitsemme suoraan konsolista koko lohkon riviltä alkaen Kyselyteksti, kaikilla aloilla:

        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 heittää kaikki kopioitu suoraan suunnitelman kenttään erottamatta mitään:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Lähdössä saamme myös bonuksen purettuun suunnitelmaan konteksti-välilehti, jossa pyyntömme esitetään kaikessa loistossaan:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

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
  }
]"

Jopa ulkoisilla lainausmerkeillä, kuten pgAdmin kopioi, jopa ilman - heitämme samaan kenttään, tulos on kauneus:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Kehittynyt visualisointi

Suunnitteluaika / toteutusaika

Nyt näet paremmin, mihin ylimääräinen aika meni kyselyä suoritettaessa:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

I/O-ajoitus

Joskus joutuu kohtaamaan tilanteen, jossa resurssien suhteen näyttää siltä, ​​ettei liikaa ole luettu ja kirjoitettu, mutta toteutusaika näyttää jostain syystä olevan epäjohdonmukaisen suuri.

Se on sanottava tässä:Voi, luultavasti sillä hetkellä palvelimen levy oli liian ylikuormitettu, siksi sen lukeminen kesti niin kauan!"Mutta jotenkin se ei ole kovin tarkkaa...

Mutta se voidaan määrittää täysin luotettavasti. Tosiasia on, että PG-palvelimen määritysvaihtoehtojen joukossa on track_io_timing:

Ottaa käyttöön ajoitetut I/O-toiminnot. Tämä asetus on oletuksena poissa käytöstä, koska se vaatii käyttöjärjestelmän jatkuvasti kyselemään kellonaikaa, mikä voi hidastaa toimintaa merkittävästi joillakin alustoilla. Voit käyttää pg_test_timing-apuohjelmaa arvioidaksesi ajastuksen yleiskustannuksia alustallasi. I/O-tilastot voidaan saada pg_stat_tietokantanäkymästä, EXPLAIN-ulostulossa (kun BUFFERS-parametria käytetään) ja pg_stat_statements-näkymän kautta.

Tämä vaihtoehto voidaan ottaa käyttöön myös paikallisessa istunnossa:

SET track_io_timing = TRUE;

No, nyt parasta on, että olemme oppineet ymmärtämään ja näyttämään nämä tiedot ottaen huomioon kaikki suorituspuun muunnokset:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Tästä näet, että 0.790 ms kokonaissuoritusajasta 0.718 ms kesti yhden sivun lukemiseen, 0.044 ms - sen kirjoittamiseen ja vain 0.028 ms käytettiin kaikkeen muuhun hyödylliseen toimintaan!

Tulevaisuus PostgreSQL 13:n kanssa

Katso täydellinen yleiskatsaus uusiin ominaisuuksiin yksityiskohtaisessa artikkelissa, ja puhumme nimenomaan suunnitelmien muutoksista.

Suunnittelupuskurit

Ajastimelle allokoitujen resurssien huomioon ottaminen näkyy toisessa korjaustiedostossa, joka ei liity pg_stat_statements. EXPLAIN PUSKURIT-vaihtoehdolla ilmoittaa suunnitteluvaiheessa käytettyjen puskurien määrän:

 Seq Scan on pg_class (actual rows=386 loops=1)
   Buffers: shared hit=9 read=4
 Planning Time: 0.782 ms
   Buffers: shared hit=103 read=11
 Execution Time: 0.219 ms

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Inkrementaalinen lajittelu

Tapauksissa, joissa tarvitaan lajittelua useiden avainten mukaan (k1, k2, k3…), suunnittelija voi nyt hyödyntää tietämystä, että tiedot on lajiteltu jo useiden ensimmäisten avainten mukaan (esim. k1 ja k2). Tässä tapauksessa et voi lajitella kaikkia tietoja uudelleen, vaan jakaa ne peräkkäisiin ryhmiin, joilla on samat arvot k1 ja k2, ja "lajitella" ne uudelleen avaimella k3.

Näin ollen koko lajittelu jakautuu useisiin peräkkäisiin pienempikokoisiin lajitteluihin. Tämä vähentää tarvittavan muistin määrää ja mahdollistaa myös ensimmäisten tietojen palauttamisen ennen kuin lajittelu on valmis.

 Incremental Sort (actual rows=2949857 loops=1)
   Sort Key: ticket_no, passenger_id
   Presorted Key: ticket_no
   Full-sort Groups: 92184 Sort Method: quicksort Memory: avg=31kB peak=31kB
   ->  Index Scan using tickets_pkey on tickets (actual rows=2949857 loops=1)
 Planning Time: 2.137 ms
 Execution Time: 2230.019 ms

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin
PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

UI/UX parannuksia

Kuvakaappauksia on kaikkialla!

Nyt jokaisella välilehdellä on mahdollisuus nopeasti ota kuvakaappaus välilehdestä leikepöydälle koko välilehden leveydeltä ja syvyydestä - "näkymä" oikealla ylhäällä:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Itse asiassa suurin osa tämän julkaisun kuvista on saatu tällä tavalla.

Suosituksia solmuista

Niitä ei ole vain enemmän, vaan jokaisesta voit lue artikkeli yksityiskohtaisestiseuraamalla linkkiä:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

Poistetaan arkistosta

Jotkut ovat pyytäneet kykyä poista "ehdottomasti" myös suunnitelmat, joita ei ole julkaistu arkistossa - klikkaa vain vastaavaa kuvaketta:

PostgreSQL-kyselysuunnitelmien ymmärtäminen entistä helpommin

No, älkäämme unohtako, että meillä on Tukiryhmäjohon voit kirjoittaa kommentteja ja ehdotuksia.

Lähde: will.com

Lisää kommentti