A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Fél éve bemutattuk magyarázat.tensor.ru - nyilvános szolgáltatás a lekérdezési tervek elemzéséhez és megjelenítéséhez a PostgreSQL-hez.

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Az elmúlt hónapokban tettünk érte jelentés a PGConf.Russia 2020 rendezvényen, összefoglalót készített cikk az SQL-lekérdezések felgyorsításáról az általa kiadott ajánlások alapján... de ami a legfontosabb, összegyűjtöttük visszajelzéseit, és megvizsgáltuk a valós felhasználási eseteket.

És most készen állunk, hogy beszámoljunk az új funkciókról, amelyeket használhat.

Különböző tervformátumok támogatása

Terv a naplóból, a kéréssel együtt

Közvetlenül a konzolról kiválasztjuk a teljes blokkot, a sortól kezdve Szöveg lekérdezése, minden kezdő szóközzel:

        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)

... és minden másolt dolgot közvetlenül a terv mezőjébe dobjon anélkül, hogy bármit elválasztana:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

A kimenetnél bónuszt is kapunk a szétszedett tervhez kontextus fül, ahol kérésünket teljes pompájában mutatják be:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

JSON és 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
  }
]"

Még külső idézőjelekkel, pgAdmin másolatként, anélkül is - ugyanabba a mezőbe dobjuk, a kimenet szépség:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Speciális vizualizáció

Tervezési idő / végrehajtási idő

Most már jobban láthatja, hová tűnt a többletidő a lekérdezés végrehajtásakor:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

I/O időzítés

Néha olyan helyzettel kell megküzdenie, amikor az erőforrásokat tekintve úgy tűnik, nem túl sokat olvastak és írtak, de úgy tűnik, hogy a végrehajtási idő valamiért nem megfelelő.

Itt kell elmondani:Ó, valószínűleg abban a pillanatban a szerveren lévő lemez túlterhelt volt, ezért tartott olyan sokáig az olvasás!"De valahogy nem túl pontos...

De abszolút megbízhatóan megállapítható. A helyzet az, hogy a PG szerver konfigurációs lehetőségei között vannak track_io_timing:

Lehetővé teszi az időzített I/O műveleteket. Ez a beállítás alapértelmezés szerint le van tiltva, mivel megköveteli, hogy az operációs rendszer folyamatosan lekérdezze az aktuális időt, ami egyes platformokon jelentősen lelassíthatja a dolgokat. A pg_test_timing segédprogram segítségével megbecsülheti az időzítés többletköltségét a platformon. I/O statisztikák a pg_stat_database nézeten keresztül érhetők el, az EXPLAIN kimenetben (ha a BUFFERS paramétert használjuk) és a pg_stat_statements nézeten keresztül.

Ez az opció helyi munkameneten belül is engedélyezhető:

SET track_io_timing = TRUE;

Nos, most az a legjobb, hogy megtanultuk megérteni és megjeleníteni ezeket az adatokat, figyelembe véve a végrehajtási fa összes transzformációját:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Itt látható, hogy a teljes végrehajtási időből 0.790 ms-ból 0.718 ms egy oldal adat kiolvasása, 0.044 ms - megírása, és csak 0.028 ms ment minden egyéb hasznos tevékenységre!

Jövő a PostgreSQL 13-mal

Az újdonságok teljes áttekintéséért lásd: egy részletes cikkben, és konkrétan a tervek változásairól beszélünk.

Tervezési pufferek

Az ütemezőhöz hozzárendelt erőforrások elszámolása egy másik javításban is megjelenik, amely nem kapcsolódik a pg_stat_statements fájlhoz. Az EXPLAIN a BUFFERS opcióval jelenti a tervezési szakaszban használt pufferek számát:

 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

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Növekményes rendezés

Azokban az esetekben, amikor sok kulcs (k1, k2, k3…) szerinti rendezésre van szükség, a tervező most kihasználhatja, hogy az adatok már több első kulcs (pl. k1 és k2) szerint vannak rendezve. Ebben az esetben nem rendezheti újra az összes adatot, hanem oszthatja fel egymást követő csoportokba ugyanazokkal a k1 és k2 értékekkel, és „újra rendezheti” őket a k3 kulccsal.

Így a teljes válogatás több egymást követő, kisebb méretű válogatásra bomlik. Ez csökkenti a szükséges memória mennyiségét, és lehetővé teszi az első adatok visszaadását a rendezés befejezése előtt.

 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

A PostgreSQL lekérdezési tervek megértése még kényelmesebben
A PostgreSQL lekérdezési tervek megértése még kényelmesebben

UI/UX fejlesztések

Képernyőképek mindenhol vannak!

Most minden lapon lehetőség van arra, hogy gyorsan készítsen képernyőképet a lapról a vágólapra a fül teljes szélességében és mélységében - "látvány" jobbra fent:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Valójában ehhez a kiadványhoz a legtöbb kép ilyen módon készült.

Javaslatok a csomópontokhoz

Nem csak több van belőlük, hanem mindegyikről lehet olvassa el a cikket részletesena linket követve:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Eltávolítás az archívumból

Néhányan kérték a képességet törölje az "abszolút" még az archívumban nem publikált terveket is, csak kattintson a megfelelő ikonra:

A PostgreSQL lekérdezési tervek megértése még kényelmesebben

Nos, ne felejtsük el, hogy van Támogató csoportahol megírhatja észrevételeit és javaslatait.

Forrás: will.com

Hozzászólás