2015-10-08 17 views
6

Dlaczego mój prosty wykonywania zapytańDlaczego skanowanie tylko indeksu trwa tak długo?

select count(this_.Id) as y0_ from Activity this_ 

trwa tak długo (ponad 10 minut to czas)?

Oto plan kwerend (wyjście z EXPLAIN ANALYSE):

QUERY PLAN 
Aggregate (cost=854047.36..854047.37 rows=1 width=4) 
> (actual time=728525.277..728525.277 rows=1 loops=1) 
-> Index Only 
> Scan using activity_pkey on activity this_ (cost=0.56..805401.87 
> rows=19458196 width=4) (actual time=36.961..725381.557 rows=19517989 
> loops=1) 
> Heap Fetches: 10351403 
Total runtime: 728533.529 ms 

i wersja PostgreSQL:

PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.7.2-5) 4.7.2, 64-bit 

Indeks jest tu, na polu ID:

ALTER TABLE public.activity 
ADD CONSTRAINT activity_pkey 
PRIMARY KEY (id); 

Odpowiedz

3

Indeks Tylko skanowanie w PostgreSQL musi czasami wyglądać w tabeli (sterty), ponieważ strony indeksu nie zawierają informacji o widoczności krotki. To ile wierszy zostało pobrane z indeksu:

(rzeczywiste ... wiersze = 19517989

A to ile wierszy zostały ponownie sprawdzone w stercie:

Pobranie sterty: 10351403

Aby przyspieszyć, należy uruchomić odkurzacz na swoim stole: vacuum Activity

Próżnia zostanie zaktualizowana visibility map, a po tym czasie skanowanie tylko indeksu będzie możliwe przy użyciu (prawie) tylko stron indeksowych.

+0

Wykonałem ODKRĘCENIE (WERBOSE, ANALIZA) w tabeli Aktywności. Następnie wynik tego samego polecenia SELECT wygląda następująco: http://pastebin.com/KJqHTAGA Nawet teraz liczba wierszy, które zostały ponownie sprawdzone, jest ogromna. Ale rzeczywiście działa trzy razy szybciej. – y434y

+0

Czy sądzisz, że dostępne są jakieś przyszłe ulepszenia? – y434y

+0

Nie widzę go, jeśli potrzebujesz dokładnej liczby. Ale jeśli ocena jest wystarczająca dla ciebie, przeczytaj to: https://wiki.postgresql.org/wiki/Slow_Counting –