Cykl życia zapytania i planer

Optymalizacja wydajności zapytań w PostgreSQL

Amy McCarty

Instructor

Podstawowy cykl życia zapytania

System Kroki front-end Procesy back-end
1 Parser Wysyła zapytanie do bazy danych Sprawdza składnię. Przekształca SQL w format przyjazny dla systemu na podstawie przechowywanych reguł.
2 Planer i optymalizator Analizuje i optymalizuje zadania zapytania Tworzy plan zapytania na podstawie statystyk. Oblicza koszty i wybiera najlepszy plan.
3 Executor Zwraca wyniki zapytania Wykonuje zapytanie zgodnie z planem.
Optymalizacja wydajności zapytań w PostgreSQL

Planer i optymalizator zapytań

Reaguje na zmiany struktury SQL

  • Generuje drzewa planów
    • Węzły odpowiadające krokom
    • Wizualizacja za pomocą EXPLAIN
  • Szacuje koszt każdego drzewa
    • Statystyki z pg_tables
    • Optymalizacja czasowa
1 Plan tree: https://www.postgresql.org/docs/current/querytree.html
Optymalizacja wydajności zapytań w PostgreSQL

Statystyki 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 | 
  • Indeksy kolumn
  • Liczba wartości null
  • Szerokość kolumn
  • Wartości unikalne
Optymalizacja wydajności zapytań w PostgreSQL

EXPLAIN

 

  • Wgląd w plan zapytania
  • Kroki i szacowane koszty
    • Nie wykonuje zapytania

 

  • Sekwencyjne skanowanie tabeli cheeses
  • Szacowania kosztów i rozmiaru

 

EXPLAIN
SELECT * FROM cheeses

 

Seq Scan on cheeses 
(cost=0.00..10.50 rows=5725 width=296)
Optymalizacja wydajności zapytań w PostgreSQL

EXPLAIN: Skanowanie

 

  • Krok planu zapytania
  • Zwraca wiersze

 

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

 

 

 

 

  • Seq Scan : skanowanie wszystkich wierszy tabeli
Optymalizacja wydajności zapytań w PostgreSQL

EXPLAIN: Koszt

 

  • Bezwymiarowy
  • Porównywanie struktur z identycznym wynikiem
    • Nie należy porównywać zapytań z różnymi wynikami

 

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

 

 

 

 

 

  • 0.00.. : czas uruchomienia
  • ..10.50 : czas całkowity

  • czas całkowity = czas uruchomienia + czas wykonania

Optymalizacja wydajności zapytań w PostgreSQL

EXPLAIN: Rozmiar

 

  • Szacowanie rozmiaru

 

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

 

 

 

  • rows : wiersze do przetworzenia przez zapytanie
  • width : szerokość wierszy w bajtach
Optymalizacja wydajności zapytań w PostgreSQL

EXPLAIN z 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[]))
  • Od dołu do góry
    • Krok 1: Filtrowanie
    • Krok 2: Skanowanie sekwencyjne
  • Klauzula WHERE
    • Zmniejsza liczbę skanowanych wierszy i zwiększa koszt całkowity
Optymalizacja wydajności zapytań w PostgreSQL

EXPLAIN z indeksem

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 opisuje krok skanowania
  • INDEKS
    • Koszt uruchomienia wzrósł od 0
    • Koszt całkowity zmniejszył się od 379
Optymalizacja wydajności zapytań w PostgreSQL

Czas na ćwiczenia!

Optymalizacja wydajności zapytań w PostgreSQL

Preparing Video For Download...