Dlaczego PostgreSQL sekwencyjnie skanuje tabelę w poszukiwaniu COUNT(*)
zapytań, podczas gdy istnieje bardzo mały i indeksowany klucz podstawowy?
Dlaczego PostgreSQL sekwencyjnie skanuje tabelę w poszukiwaniu COUNT(*)
zapytań, podczas gdy istnieje bardzo mały i indeksowany klucz podstawowy?
Odpowiedzi:
Na oficjalnych stronach wiki dać odpowiedź, że:
[...] Powód, dla którego jest to powolny, jest związany z implementacją MVCC w PostgreSQL. Fakt, że wiele transakcji widzi różne stany danych, oznacza, że „COUNT (*)” nie może mieć prostego sposobu na podsumowanie danych w całej tabeli; PostgreSQL musi w pewnym sensie przejść przez wszystkie wiersze. Zwykle powoduje to odczyt sekwencyjnego skanu informacji o każdym wierszu w tabeli. [...]
Ponadto można wypróbować ANALIZĘ, aby odbudować informacje dla narzędzia do planowania zapytań.
Powinieneś uzyskać lepszą wydajność, COUNT(an uniquly indexed field)
ale jeśli jest to bardzo duże, skanowanie sekwencyjne jest jedynym sposobem, aby to zrobić.
Jeśli potrzebujesz bardzo szybkich numerów i nie boisz się zapytać o schemat, możesz wykonać następujące czynności
SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass
Ale nie polegaj na tych wartościach, ponieważ jest to tylko „szacunkowa” (choć często dokładna) liczba krotek w tabeli.
EXPLAIN SELECT * from your_table;
. Nie spowoduje to wykonania zapytania. Dane wyjściowe obejmują rows=…
szacunkową liczbę wierszy.
COUNT(pk)
poprawi się wydajność. Myślę, że zawsze wykona skan