Životní cyklus dotazu a plánovač

Optimalizace výkonu dotazů v PostgreSQL

Amy McCarty

Instructor

Základní životní cyklus dotazu

Systém Kroky na straně klienta Procesy na straně serveru
1 Parser Odeslání dotazu do databáze Kontroluje syntaxi. Převádí SQL do strojově čitelnější podoby na základě systémových pravidel.
2 Plánovač a optimalizátor Posouzení a optimalizace dotazu Využívá statistiky databáze k vytvoření plánu dotazu. Vypočítává náklady a volí nejlepší plán.
3 Exekutor Vrácení výsledků dotazu Provádí dotaz podle plánu.
Optimalizace výkonu dotazů v PostgreSQL

Plánovač a optimalizátor dotazů

Reaguje na změny struktury SQL

  • Generuje stromy plánů
    • Uzly odpovídají jednotlivým krokům
    • Vizualizace pomocí EXPLAIN
  • Odhaduje náklady každého stromu
    • Statistiky z pg_tables
    • Optimalizace na základě času
1 Plan tree: https://www.postgresql.org/docs/current/querytree.html
Optimalizace výkonu dotazů v PostgreSQL

Statistiky z pg_tables

SELECT * FROM pg_class
WHERE relname = 'mytable'
-- sample of output columns
| relname | relhasindex |
SELECT * FROM pg_stats
WHERE tablename = 'mytable'
-- sample of output columns
null_frac | avg_width | n_distinct | 
  • Indexy sloupců
  • Počet hodnot null
  • Šířka sloupce
  • Unikátní hodnoty
Optimalizace výkonu dotazů v PostgreSQL

EXPLAIN

 

  • Náhled do plánu dotazu
  • Kroky a odhady nákladů
    • Dotaz se neprovede

 

  • Sekvenční prohledávání tabulky cheeses
  • Odhady nákladů a velikosti

 

EXPLAIN
SELECT * FROM cheeses

 

Seq Scan on cheeses 
(cost=0.00..10.50 rows=5725 width=296)
Optimalizace výkonu dotazů v PostgreSQL

EXPLAIN: Prohledávání

 

  • Krok plánu dotazu
  • Vrací řádky

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

 

  • Seq Scan : prohledání všech řádků tabulky
Optimalizace výkonu dotazů v PostgreSQL

EXPLAIN: Náklady

 

  • Bezrozměrná hodnota
  • Porovnávejte struktury se stejným výstupem
    • Dotazy s jiným výstupem neporovnávejte

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

 

 

  • 0.00.. : čas spuštění
  • ..10.50 : celkový čas

  • celkový čas = čas spuštění + čas běhu

Optimalizace výkonu dotazů v PostgreSQL

EXPLAIN: Velikost

 

  • Odhady velikosti

 

Seq Scan on cheeses (cost=0.00..10.50 rows=5725 width=296)

 

 

 

  • rows : počet řádků, které dotaz musí prověřit
  • width : šířka řádků v bajtech
Optimalizace výkonu dotazů v PostgreSQL

EXPLAIN s klauzulí WHERE

EXPLAIN
SELECT * FROM cheeses WHERE species IN ('goat','sheep') 
Seq Scan on cheeses (cost=0.00..378.90 rows=3 width=118)
 -> Filter: (species = ANY ('{"goat","sheep"}'::text[]))
  • Odspodu nahoru
    • Krok 1: Filtr
    • Krok 2: Sekvenční prohledávání
  • Klauzule WHERE
    • Snižuje počet prohledávaných řádků a zvyšuje celkové náklady
Optimalizace výkonu dotazů v PostgreSQL

EXPLAIN s indexem

EXPLAIN
SELECT * FROM cheeses WHERE species IN ('goat','sheep') -- index on species column
Bitmap Index Scan using species_idx on cheeses (cost=0.29..12.66 rows=3 width=118)
  Index Cond: (species = ANY ('{"goat","sheep"}'::text[]))
  • Krok 1: Bitmap Index Scan
    • Index Cond popisuje krok prohledávání
  • INDEX
    • Čas spuštění se zvýšil z 0
    • Celkové náklady se snížily z 379
Optimalizace výkonu dotazů v PostgreSQL

Pojďme si procvičit!

Optimalizace výkonu dotazů v PostgreSQL

Preparing Video For Download...