SQL langsam

Hallo zusammen,
habe Probleme mit dem folgenden SQL, er erscheint mir extrem langsam :

SELECT 
                                                            int4(1000000/float8((sum(sj)+sum(parts)))*sum(fehler)),
                                                            to_char(max(r_date), 'DY')

                                              FROM aoi_auswertung 
                                                WHERE 
                                                  r_date like '2014-04-08%'  
                                                  AND loetproz='REFLOW' 
                                                  AND prod_art='SER'
                                                  AND ds_r_ok=1
                                                GROUP by date(r_date)

Hat jemand eine Idee an was das liegen könnte?

Danke
Gruß
Andreas

Ja, frag den Herrn EXPLAIN.

Aber grob gesehen:

  • DATE like ‘String%’
  • GROUP BY date(TEXT)

sieht mir schon mal nach FAIL aus.

Danke,
folgende Änderung hat die Zeit halbiert:

SELECT                                                             int4(1000000/float8((sum(sj)+sum(parts)))*sum(fehler)),
                                                            to_char(max(r_date), 'DY')

                                              FROM aoi_auswertung 
                                                WHERE 
                                                  date(r_date) = '2014-04-08'  
                                                  AND loetproz='REFLOW' 
                                                  AND prod_art='SER'
                                                  AND ds_r_ok=1
                                                GROUP by date(r_date)

Wie kann ich die Gruppierung anders lösen? Hab da keine Idee

Danke

Gruß
Andreas

Ich denke, Dein Problem ist, daß Du einen Text-Typ für einen DATE-Typ vergewaltigst. Ein funktionaler Index auf der Spalte mag helfen, aber das wäre nur ein Würgaround. Besser: korrekte Datentypen verwenden. Immer.

hmm, ich habe die Spalte r_date als “timestamp with time Zone” definiert, benötige jetzt aber eben eine Gruppierung
des Datums, nicht der Uhrezit zusätzlich. Heißt das ich sollte eine Zusatzsplate in der Tabelle vom Typ date haben? Könnte das helfen?

Jetzt schreib ich das zum dritten Mal, weil ich irgnwie immer aus der Anmeldung flieg …


Das Problem ist, daß timestamp with time zone halt von der Zeitzone anhängt. Nachts um 2 Uhr in Tokio ist ein anderes Datum als gleichzeitig in New York.


Versuch mal einen Index wie folgt zu setzen: (mit Explain-Demo)


test=# create table minor (ts timestamptz);
CREATE TABLE
Time: 0,936 ms
test=*# create index idx_ts on minor (((ts)));
CREATE INDEX
Time: 5,370 ms
test=*# set enable_seqscan to false;
SET
Time: 0,047 ms
test=*# explain select * from minor where ts::date = current_date;
                               QUERY PLAN
-------------------------------------------------------------------------
 Bitmap Heap Scan on minor  (cost=14.86..67.66 rows=11 width=8)
   Filter: ((ts)::date = ('now'::cstring)::date)
   ->  Bitmap Index Scan on idx_ts  (cost=0.00..14.86 rows=2140 width=0)
(3 rows)

HI Akretschmer,
Index habe ich versucht, bringt nicht wirklich was.
Ich werde jetzt mal ein eigenes Datumsfeld anlegen, und schauen was passiert.

Melde mich wieder.

Gruß
Andras

Hallo Akretschmer,
bring tatsächlich noch etwas mehr (4 Sekunden von ursprünlich 6 im Browser, sprich mit cgi…)