2015-10-08 8 views
6

Warum meine einfache AbfrageWarum Index Only Scan dauert so lange?

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

nehmen so lange dauert die Ausführung (mehr als 10 Minuten dieses Mal)? Hier

ist die Abfrage-Plan (Ausgabe des EXPLAIN ANALYZE):

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 

Und PostgreSql Version:

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

Der Index ist auch hier auf dem Feld Id:

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

Antwort

3

Index Nur Scan in PostgreSQL muss manchmal in die Tabelle (Heap) schauen, da Indexseiten keine Informationen enthalten über Tupelsichtbarkeit. Das ist, wie viele Zeilen aus dem Index abgerufen wurden:

(Ist ... rows = 19517989

Und das ist, wie viele Zeilen wurden in der Halde erneut geprüft:

Heap Holt: 10351403

es zu beschleunigen, sollten Sie Vakuum auf Sie Tabelle ausführen: vacuum Activity

Vacuum wird aktualisiert visibility map, und danach kann Index Only Scan mit (fast) nur Indexseiten durchführen.

+0

Ich habe die VACUUM (VERBOSE, ANALYSE) in der Aktivitätstabelle getan. Danach sieht die Ausgabe des gleichen SELECT-Befehls wie folgt aus: http://pastebin.com/KJqHTAGA Auch jetzt ist die Anzahl der Zeilen, die erneut überprüft wurden, sehr groß. Aber tatsächlich wird es dreimal schneller ausgeführt. – y434y

+0

Glauben Sie, dass es zukünftige Verbesserungen gibt? – y434y

+0

Ich kann keins sehen, wenn Sie eine genaue Anzahl benötigen. Aber wenn eine Schätzung für Sie ausreichend ist, lesen Sie dies: https://wiki.postgresql.org/wiki/Slow_Counting –