0Pricing
SQL Academy · Lekcja

ANALYZE i pg_statistic

Aktualizować statystyki planisty za pomocą ANALYZE, analizować pg_statistic i używać statystyk rozszerzonych dla skorelowanych kolumn

ANALYZE i pg_statistic to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Dlaczego ANALYZE?

Planiście zapytań potrzebne są szacunki liczby wierszy i selektywności, aby wybrać dobry plan. Szacunki te pochodzą ze statystyk dla poszczególnych kolumn, zbieranych przez ANALYZE.

Kiedy uruchamiać ANALYZE

Autovacuum automatycznie uruchamia ANALYZE na podstawie progów zmian liczby wierszy. Po masowym załadowaniu danych lub dużych operacjach DELETE należy uruchomić je ręcznie, aby plany nie ulegały pogorszeniu:

ANALYZE orders;
ANALYZE (VERBOSE) orders;

Próbkowanie

ANALYZE próbuje po kilkaset wierszy dla każdej kolumny. Należy dostosować cel statystyk, jeśli wartości domyślne prowadzą do błędnych szacunków:

ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.

pg_statistic

Katalog systemowy, w którym przechowywane są statystyki (dla czytelności należy używać widoku pg_stats):

SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';

Na co zwraca uwagę planista

  • n_distinct — liczba różnych wartości
  • most_common_vals — najczęstsze wartości i ich częstości
  • histogram_bounds — przedziały dla zapytań zakresowych
  • correlation — uporządkowanie fizyczne względem logicznego (wpływa na koszt skanowania)

Statystyki rozszerzone

Statystyki dla poszczególnych kolumn nie uwzględniają korelacji między kolumnami. CREATE STATISTICS pozwala je rejestrować:

CREATE STATISTICS orders_country_status (dependencies)
  ON country, status FROM orders;
ANALYZE orders;

-- Now the planner knows that  country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').

Rodzaje statystyk wielowymiarowych

  • dependencies — zależności funkcyjne (jedna kolumna przewiduje wartość innej)
  • ndistinct — kombinacje różnych wartości
  • mcv — najczęstsze połączone wartości (PG 12+)

Błędne szacunki → błędne plany

Najczęstszym powodem problemu „dlaczego moje zapytanie działa wolno” są błędne szacunki liczby wierszy. Planista wybiera Nested Loop, ponieważ spodziewa się 1 wiersza, podczas gdy w rzeczywistości jest ich 1 000 000.

EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.

Wymuszanie ANALYZE w migracjach

Po dużym masowym załadowaniu danych:

COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.

Statystyki nie aktualizują się automatycznie przy zmianie rozkładu danych

Jeśli dane z dzisiaj znacząco różnią się od wczorajszych, statystyki mogą pozostać nieaktualne do czasu uruchomienia autoanalyze. Po zmianie charakterystyki danych należy ręcznie uruchomić ANALYZE.

pg_class.reltuples

Planista korzysta również z szacowanej liczby wierszy pochodzącej z pg_class. Jest ona aktualizowana przez VACUUM/ANALYZE. Można ją szybko sprawdzić:

SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';

Podsumowanie

ANALYZE dostarcza dane planiście.

  • Uruchamiać po dużych zmianach danych
  • Zwiększyć cel STATISTICS dla kolumn o nierównomiernym rozkładzie wartości
  • Używać CREATE STATISTICS dla korelacji między kolumnami
  • Duża różnica między szacowaną a rzeczywistą liczbą wierszy = pierwsza rzecz do naprawienia

Szybkie sprawdzenie

EXPLAIN ANALYZE pokazuje estimated rows=1, ale actual rows=500,000 dla jednoparametrowego warunku WHERE. Jaka powinna być pierwsza poprawka?

Często zadawane pytania

Czy lekcja „ANALYZE i pg_statistic” jest bezpłatna?

Tak — pełny tekst „ANALYZE i pg_statistic” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „ANALYZE i pg_statistic”?

Aktualizować statystyki planisty za pomocą ANALYZE, analizować pg_statistic i używać statystyk rozszerzonych dla skorelowanych kolumn Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „ANALYZE i pg_statistic”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. MVCC i przyczyny bloatu
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE i pg_statistic
  4. Skanowanie wyłącznie indeksu i Visibility Map
← Powrót do SQL Academy