Frågans livscykel och planeraren

Förbättra frågeprestanda i PostgreSQL

Amy McCarty

Instructor

Frågans grundläggande livscykel

System Steg i frontend Processer i backend
1 Parser Skicka fråga till databas Kontrollerar syntax. Översätter SQL till ett mer datorvänligt format baserat på systemets regler.
2 Planerare & optimerare Bedöm och optimera frågeuppgifter Använder databasstatistik för att skapa en frågeplan. Beräknar kostnader och väljer den bästa planen.
3 Executor Returnera frågeresultat Följer frågeplanen för att köra frågan.
Förbättra frågeprestanda i PostgreSQL

Frågans planerare och optimerare

Reagerar på SQL-strukturförändringar

  • Genererar planträd
    • Noder motsvarar steg
    • Visualisera med EXPLAIN
  • Uppskatta kostnaden för varje träd
    • Statistik från pg_tables
    • Tidsbaserad optimering
1 Plan tree: https://www.postgresql.org/docs/current/querytree.html
Förbättra frågeprestanda i PostgreSQL

Statistik från 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 | 
  • Kolumnindex
  • Räkna null-värden
  • Kolumnbredd
  • Distinkta värden
Förbättra frågeprestanda i PostgreSQL

EXPLAIN

 

  • Insyn i frågeplanen
  • Steg och uppskattade kostnader
    • Kör inte frågan

 

  • Sekventiell genomsökning av tabellen cheeses
  • Kostnads- och storleksuppskattningar

 

EXPLAIN
SELECT * FROM cheeses

 

Seq Scan on cheeses 
(cost=0.00..10.50 rows=5725 width=296)
Förbättra frågeprestanda i PostgreSQL

EXPLAIN: Genomsökning

 

  • Steg i frågeplanen
  • Returnerar rader

 

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

 

 

 

 

  • Seq Scan : genomsökning av alla rader i tabellen
Förbättra frågeprestanda i PostgreSQL

EXPLAIN: Kostnad

 

  • Dimensionslös
  • Jämför strukturer med samma utdata
    • Jämför inte frågor med olika utdata

 

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

 

 

 

 

 

  • 0.00.. : starttid
  • ..10.50 : total tid

  • total tid = starttid + körtid

Förbättra frågeprestanda i PostgreSQL

EXPLAIN: Storlek

 

  • Storleksuppskattningar

 

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

 

 

 

  • rows : rader som frågan behöver granska
  • width : radernas bredd i byte
Förbättra frågeprestanda i PostgreSQL

EXPLAIN med en WHERE-sats

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[]))
  • Nedifrån och upp
    • Steg 1: Filter
    • Steg 2: Sekventiell genomsökning
  • WHERE-sats
    • Minskar rader att genomsöka och ökar totalkostnaden
Förbättra frågeprestanda i PostgreSQL

EXPLAIN med ett index

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[]))
  • Steg 1: Bitmap Index Scan
    • Index Cond förklarar genomsökningssteget
  • INDEX
    • Startkostnaden ökade från 0
    • Totalkostnaden minskade från 379
Förbättra frågeprestanda i PostgreSQL

Nu kör vi en övning!

Förbättra frågeprestanda i PostgreSQL

Preparing Video For Download...