Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Pred pol rokom sme prezentovali vysvetliť.tensor.ru - verejný služba na analýzu a vizualizáciu plánov dotazov do PostgreSQL.

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Počas posledných mesiacov sme o ňom robili správa na PGConf.Russia 2020, pripravil zhrnutie článok o zrýchlení SQL dotazov na základe odporúčaní, ktoré poskytuje... ale čo je najdôležitejšie, zhromaždili sme vašu spätnú väzbu a pozreli sme sa na skutočné prípady použitia.

A teraz sme pripravení hovoriť o nových príležitostiach, ktoré môžete využiť.

Podpora rôznych formátov plánov

Plán z denníka spolu so žiadosťou

Priamo z konzoly vyberte celý blok, začínajúc od riadku s Text dopytu, so všetkými úvodnými medzerami:

        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)

... a všetko skopírované vložte priamo do poľa plánu bez toho, aby ste čokoľvek oddeľovali:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Na konci dostaneme bonus k rozloženému plánu a záložka „kontext“., kde je naša žiadosť prezentovaná v celej svojej kráse:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

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

Buď s externými úvodzovkami, ako skopíruje pgAdmin, alebo bez nich - hodíme to do rovnakého poľa a výstup je krásny:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Pokročilá vizualizácia

Čas plánovania/čas vykonania

Teraz môžete lepšie vidieť, kde bol čas navyše strávený vykonávaním dotazu:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

I/O časovanie

Niekedy sa musíte popasovať so situáciou, keď sa z hľadiska zdrojov zdá, že sa toho veľa nečítalo a písalo, ale čas vykonania sa zdá byť neprimerane dlhý.

Tu musíme povedať: "Ach, pravdepodobne v tom momente bol disk na serveri príliš preťažený, preto to čítanie trvalo tak dlho!"Ale nejako to nie je veľmi presné...

Ale to sa dá určiť úplne spoľahlivo. Faktom je, že medzi možnosťami konfigurácie servera PG existuje track_io_timing:

Umožňuje načasovanie I/O operácií. Táto možnosť je predvolene vypnutá, pretože vyžaduje neustále dopytovanie operačného systému na aktuálny čas, čo môže na niektorých platformách výrazne spomaliť výkon. Ak chcete odhadnúť náklady na časovanie na vašej platforme, môžete použiť pomôcku pg_test_timing. Vstupno-výstupné štatistiky možno získať prostredníctvom zobrazenia pg_stat_database, vo výstupe EXPLAIN (keď sa používa parameter BUFFERS) a cez pohľad pg_stat_statements.

Túto možnosť je možné povoliť aj v rámci lokálnej relácie:

SET track_io_timing = TRUE;

Najlepšie na tom je, že sme sa naučili chápať a zobrazovať tieto údaje berúc do úvahy všetky transformácie stromu vykonávania:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Tu môžete vidieť, že z 0.790 ms celkového času vykonávania trvalo 0.718 ms čítanie jednej dátovej stránky, 0.044 ms jej zápis a iba 0.028 ms bolo vynaložených na všetky ostatné užitočné činnosti!

Budúcnosť s PostgreSQL 13

Nájdete tu úplný prehľad inovácií v podrobnom článku, a to konkrétne hovoríme o zmenách plánov.

Plánovacie nárazníky

Účtovanie zdrojov pridelených plánovaču sa odráža v inej oprave, ktorá nesúvisí s pg_stat_statements. EXPLAIN s možnosťou BUFFERS oznámi počet vyrovnávacích pamätí použitých počas plánovacej fázy:

 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

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Prírastkové triedenie

V prípadoch, keď je potrebné triedenie na mnohých kľúčoch (k1, k2, k3...), môže teraz plánovač využiť vedomosť, že dáta sú už triedené na niekoľkých z prvých kľúčov (napríklad k1 a k2). V tomto prípade nemôžete znova zoradiť všetky údaje, ale rozdeliť ich do po sebe nasledujúcich skupín s rovnakými hodnotami k1 a k2 a „pretriediť“ pomocou kľúča k3.

Celé triedenie je teda rozdelené do niekoľkých po sebe nasledujúcich druhov menších rozmerov. To znižuje množstvo potrebnej pamäte a tiež umožňuje výstup prvých údajov pred dokončením celého triedenia.

 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

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie
Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Vylepšenia UI/UX

Snímky obrazovky, sú všade!

Teraz je na každej karte možnosť rýchlo urobte snímku obrazovky karty do schránky celá šírka a hĺbka záložky - "pohľad" vpravo hore:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

V skutočnosti väčšina obrázkov pre túto publikáciu bola získaná týmto spôsobom.

Odporúčania pre uzly

Nielenže ich pribudlo, ale o každom sa dá aj rozprávať prečítajte si podrobne článokpomocou odkazu:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

Vymazanie z archívu

Niektorí ľudia skutočne požiadali o pridanie možnosti vymazať "úplne" aj plány, ktoré nie sú zverejnené v archíve - stačí kliknúť na príslušnú ikonu:

Pochopenie plánov dotazov PostgreSQL ešte pohodlnejšie

No nezabudnite, že máme Podporná skupina, kde môžete písať svoje pripomienky a návrhy.

Zdroj: hab.com

Pridať komentár