Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Planer zapytań Postgres wykorzystuje statystyki planera do oszacowania, ile wierszy zwraca każdy krok zapytania oraz do wyboru planu realizacji. Ta strona opisuje, kiedy Postgres automatycznie generuje statystyki planowania, jak znaleźć tabele, w których brakuje tych statystyk, oraz jak zmieniać momenty, gdy są one generowane dla tabeli. Aby dowiedzieć się, jak Lakebase zachowuje statystyki przy restartach obliczeniowych i skalowaniu do zera, zobacz Zbieranie statystyk.
Kiedy działa ANALYZE w tabeli?
Autovacuum automatycznie generuje statystyki planera, uruchamiając ANALYZE na tabeli, gdy zmieni się wystarczająco wiele wierszy. Tabela jest analizowana, gdy liczba wierszy wstawionych, zaktualizowanych lub usuniętych od ostatniej analizy przekracza:
autovacuum_analyze_threshold + autovacuum_analyze_scale_factor × number of rows in the table
Przy domyślnych ustawieniach (autovacuum_analyze_threshold = 50 i autovacuum_analyze_scale_factor = 0.1), nowa tabela jest analizowana po wstawieniu, aktualizacji lub usunięciu ponad 50 wierszy, a istniejąca tabela po zmianie ponad 50 wierszy oraz 10% wszystkich jej wierszy. W rezultacie tabela, która jest ładowana jednorazowo, z 50 lub mniejszą liczbą wierszy i nigdy nie jest modyfikowana, nigdy nie jest analizowana przez autovacuum. Bez statystyk planera planer polega na domyślnych szacunkach, co może prowadzić do nieefektywnych planów zapytań, gdy ta tabela jest łączona z większymi tabelami.
Databricks zaleca uruchamianie ANALYZE na nowych tabelach po początkowym wczytaniu danych oraz na tabelach z 50 lub mniejszą liczbą wierszy (domyślny próg autoanalizy), aby dokładne statystyki planera były dostępne, zanim tabele zostaną odpytane.
Analizuj tabele partycjonowane
Autovacuum analizuje każdą partycję tabeli partycjonowanej, gdy wiersze w tej partycji się zmieniają, ale nigdy nie analizuje samej tabeli partycjonowanej (nadrzędnej). Statystyki dla elementu nadrzędnego opisują całą tabelę i są generowane tylko wtedy, gdy uruchamiasz ANALYZE na elemencie nadrzędnym. Bez nich zapytania odwołujące się do tabeli partycjonowanej mogą mieć nieefektywne plany. Uruchamiaj ANALYZE na obiekcie nadrzędnym po pierwszym załadowaniu danych do niego oraz ponownie za każdym razem, gdy rozkład danych między partycjami znacząco się zmieni:
ANALYZE my_schema.my_partitioned_table;
Gdy uruchamiasz ANALYZE na tabeli nadrzędnej, Postgres pobiera próbki wierszy ze wszystkich partycji, aby zbudować statystyki tabeli nadrzędnej. Domyślnie analizuje także każdą partycję i aktualizuje jej statystyki, co może zająć dużo czasu w dużej tabeli.
W Postgres 18 i nowszych użyj ANALYZE ONLY, aby zaktualizować statystyki nadrzędne bez analizowania każdej partycji. Postgres nadal pobiera próbki wierszy ze wszystkich partycji, a autovacuum nadal analizuje partycje w miarę zmiany ich wierszy.
ANALYZE ONLY my_schema.my_partitioned_table;
W Postgres 16 i 17, ANALYZE w tabeli partycjonowanej zawsze analizuje wszystkie partycje. W dowolnej wersji, aby zaktualizować statystyki dla jednej partycji, uruchom ANALYZE na tej partycji.
Znajdź tabele bez statystyk planera
Aby znaleźć tabele bez statystyk planera, poszukaj tabel bez wierszy w widoku pg_stats . Statystyki planera są przechowywane trwało, więc ta kontrola jest wiarygodna nawet po zresetowaniu statystyk kumulatywnych. Zapytanie wyklucza schematy systemowe oraz schematy, których Lakebase używa wewnętrznie dla interfejsu Data API i synchronizowanych tabel.
SELECT t.schemaname, t.tablename
FROM pg_tables t
WHERE t.schemaname NOT IN ('pg_catalog', 'information_schema', '__db_system', 'pgrst')
AND t.schemaname NOT LIKE '\_\_db\_user\_%'
AND NOT EXISTS (
SELECT 1 FROM pg_stats s
WHERE s.schemaname = t.schemaname AND s.tablename = t.tablename
)
ORDER BY 1, 2;
Uruchom zapytanie jako członek databricks_superuser roli lub jako właściciel tabeli. Widok pg_stats pokazuje statystyki tylko dla kolumn, które aktualna rola może odczytać. Tabela z włączonym zabezpieczeniem na poziomie wiersza również ukrywa statystyki, chyba że rola może obejść zabezpieczenia na poziomie wiersza. Tabela, której aktualna rola nie może odczytać lub która ma włączone zabezpieczenia na poziomie wiersza, może pojawić się w wynikach nawet jeśli zawiera statystyki.
Tabele, które nigdy nie zawierały danych, również pojawiają się w wynikach, ponieważ ANALYZE nie generuje statystyk dla pustej tabeli. Skup się na tabelach zawierających dane i wykorzystywanych w zapytaniach.
Aby wygenerować statystyki planera dla tabeli zwracanej przez zapytanie, wykonaj ANALYZE:
ANALYZE my_schema.my_table;
Aby przeanalizować każdą tabelę w aktualnej bazie danych, uruchom ANALYZE bez nazwy tabeli.
Dostosowanie ustawień autovacuum dla tabeli
Jeśli tabela zmienia się zbyt rzadko dla domyślnych progów, możesz obniżyć próg analizy tylko dla tej tabeli. Na przykład, aby przeanalizować małą tabelę odniesień po ponad 10 modyfikacjach wierszy, niezależnie od jej rozmiaru:
ALTER TABLE my_schema.my_table SET (
autovacuum_analyze_threshold = 10,
autovacuum_analyze_scale_factor = 0
);
Aby zobaczyć niestandardowe ustawienia w tabeli, wykonaj zapytanie pg_class.reloptions:
SELECT relname, reloptions
FROM pg_class
WHERE oid = 'my_schema.my_table'::regclass;
Aby przywrócić domyślne zachowanie, zresetuj ustawienia:
ALTER TABLE my_schema.my_table RESET (
autovacuum_analyze_threshold,
autovacuum_analyze_scale_factor
);
Nawet przy niższym progu autovacuum nie analizuje tabeli, jeśli liczba załadowanych wierszy nie przekracza progu i tabela nie jest później modyfikowana. Dla tabel statycznych uruchom ANALYZE po załadowaniu danych.
Więcej informacji można znaleźć w dokumentacji Postgres: