Ich bin nicht sehr vertraut mit EXPLAIN ANALYSE Ergebnisse, ich habe ein großes Problem mit meinen Abfragen zu langsam. Ich habe versucht, zu lesen, wie man Ergebnisse von EXPLAIN-Abfragen interpretiert, aber ich weiß immer noch nicht, wonach ich suchen sollte und was falsch sein könnte. Ich habe das Gefühl, dass irgendwo ein großes rotes Licht blinkt, ich sehe es einfach nicht.So verstehen Sie eine EXPLAIN-ANALYSE
Also die Abfrage ziemlich einfach ist, sieht es wie folgt aus:
EXPLAIN ANALYZE SELECT "cars".* FROM "cars" WHERE "cars"."sales_state" = 'onsale' AND "cars"."brand" = 'BMW' AND "cars"."model_name" = '318i' AND "cars"."has_auto_gear" = TRUE LIMIT 25 OFFSET 0
Und das Ergebnis wie folgt aus:
Limit (cost=0.00..161.07 rows=25 width=1245) (actual time=35.232..38.694 rows=25 loops=1)
-> Index Scan using index_cars_onsale_on_brand_and_model_name on cars (cost=0.00..1179.06 rows=183 width=1245) (actual time=35.228..38.652 rows=25 loops=1)
Index Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text))
Filter: has_auto_gear"
Total runtime: 38.845 ms
Ein wenig Hintergrund: ich auf Postgresql bin 9.1.6, läuft auf speziellen Datenbanken von Herokus. Meine DB hat ca. 7,5 GB RAM, die Table Cars 3,1 Mio. Zeilen und ca. 2,0 Mio. der Zeilen hat sales_state = 'onsale'. Die Tabelle hat 170 Spalten. Der Index, den er verwendet, sieht ungefähr so aus:
CREATE INDEX index_cars_onsale_on_brand_and_model_name
ON cars
USING btree
(brand COLLATE pg_catalog."default" , model_name COLLATE pg_catalog."default")
WHERE sales_state::text = 'onsale'::text;
Wer sieht ein großes offensichtliches Problem?
EDIT:
SELECT pg_relation_size('cars'), pg_total_relation_size('cars');
pg_relation_size: 2058444800 pg_total_relation_size: 4900126720
SELECT pg_relation_size('index_cars_onsale_on_brand_and_model_name');
pg_relation_size: 46301184
SELECT avg(pg_column_size(cars)) FROM cars limit 5000;
avg: 636,9732567210792995
OHNE LIMIT:
EXPLAIN ANALYZE SELECT "cars".* FROM "cars" WHERE "cars"."sales_state" = 'onsale' AND "cars"."brand" = 'BMW' AND "cars"."model_name" = '318i' AND "cars"."has_auto_gear" = TRUE
Bitmap Heap Scan on cars (cost=12.54..1156.95 rows=183 width=4) (actual time=17.067..55.198 rows=2096 loops=1)
Recheck Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text) AND ((sales_state)::text = 'onsale'::text))
Filter: has_auto_gear
-> Bitmap Index Scan on index_cars_onsale_on_brand_and_model_name (cost=0.00..12.54 rows=585 width=0) (actual time=15.211..15.211 rows=7411 loops=1)"
Index Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text))
Total runtime: 56.851 ms
Versuchen Sie saugen - http://www.postgresql.org/docs/8.1/static/maintenance.html. Der Abfrageplan sieht vernünftig aus, aber die Zeit tut es sicherlich nicht! –
Kurz bevor ich die Abfrage durchführte, lief ich ein komplettes Vakuum und analysierte auch ... Meine Website ist eine Suchmaschine für Gebrauchtwagen, daher ist das Timing bei weitem nicht akzeptabel. Mein Ziel ist es, die Gesamtzeit auf weniger als 1 Sekunde zu reduzieren. Denken Sie, dass das überhaupt möglich ist, oder muss ich nach einer anderen Technologie als einer rationalen Datenbank suchen? –
@NielsKristian Ich denke, ein großer Teil des Problems könnte der Teil "170 Spalten" sein. Wie groß ist der Tisch? 'SELECT pg_relation_size ('Autos'), pg_total_relation_size ('Autos');'. Auch 'SELECT pg_relation_size ('index_cars_onsale_on_brand_and_model_name');', um die Indexgröße zu erhalten. Wie groß ist die durchschnittliche Zeilenbreite? 'SELECT avg (pg_column_size (Autos)) FROM Testwagen Grenze 5000;' –