Postgre Geschwindigkeit?

Hmm, ich kann es jetzt auch nicht mehr reproduzieren. Aber ich habe das definitiv schon gesehen…

Nichtsdestoweniger gehören Zahlen nicht in single quotes :wink:

Das war imho in sehr alten Versionen so - bzw. genau andersherum: wenn du Zahlen nicht in Quotes gesetzt hast und hast das mit Zahlen in einer Textspalte verglichen, dann wurde der Index nicht verwendet. Auf der einen Seite stand dann Text, auf der anderen wurde sehr früh beim Parsen ein Integer erkannt. Irgendwann bei 7.4 oder 8.0 habe ich das - glaube ich - zuletzt gesehen.

Oh, und auch Integer dürfen in Quotes stehen. Die Datenbank castet die Werte dann passend, und zwar nur ein einziges Mal. Im Gegenzug beseitigt man ein paar lästige Gemeinheiten wie Syntax Fehler, falls der Web User dort einen Text eintippt statt nur eine Zahl (gequotet werden muss aber trotzdem).

Hi, Danke für eure Hilfe. Es klappt jetzt schon viel besser! Ein Problem habe ich aber immer noch.

Ich möchte an einem gegebenen Datum prüfen, um wieviel Uhr der erste Eintrag gemacht wurde. Hierzu verwende ich folgende Abfrage:

SELECT v.current_time_stamp
    FROM t_value_time AS v, t_mp_og AS m
    WHERE v.mp_id = m.mp_id
    AND v.current_time_stamp BETWEEN '2010-05-01 00:00:00' AND '2010-05-01 23:59:59'
    ORDER BY v.current_time_stamp ASC
    LIMIT 1

Das dauert leider ca. eine Viertelsekunde. Und bei mehreren Anfragen eben x-mal so lang. Da ich einige Dinge überprüfe warte ich immer 30 Sekunden. Gibt es einen Weg, das schneller zu machen? Ich habe schon probiert den BETWEEN auf den Zeitraum von 00:00:00 bis 00:15:00 einzuschränken, ist aber nicht viel schneller.

Vielen Dank,
MrB

Liegt ein Index auf der Spalte current_time_stamp ?

Nein, aber auf einigen anderen Spalten der Tabelle (z.B. time_id). Kann es daran liegen?

Kann. Probier es halt aus.

Hab ich gerade und BUMM! Extrem schnell. Danke schön! Super Hilfe! Von 30sek Wartezeit auf 0,01s runter.

Sehr gut.

dove: Schreib ihm bitte eine Rechnung, ja? :wink:

Gibt es rein technisch auch ne schnellere Möglichkeit, an den ersten Timestamp zu kommen? Alle Timestamps zu sortieren und dann LIMIT 1 zu machen scheint mir sehr umständlich.

Du könntest in einem Subselect die passende ID über MIN() oder MAX() (je nach Sortierrichtung) heraussuchen und dann direkt den Datensatz mit dieser ID holen.

Das scheint noch viel länger zu dauern. Ich hab es so gemacht:

SELECT MIN(dingens.current_time_stamp)
FROM (
    SELECT current_time_stamp
    FROM t_value_time
) AS dingens

Hab ich das richtig zusammengebaut, so wie du meintest?

Gegenfrage: funktioniert das? :wink:
(Ich glaube nicht)


Nein, du könntest in der WHERE Bedingung deines Joins einen Subselect einbauen, der über MIN/MAX die passende ID der Zeile zurückliefert. Dann musst du nicht mehr nach Timestamps sortieren sondern kannst direkt die jeweilige Zeile auslesen.

Ai ai, wird gemacht :smiley:

Ja, das oben Geschriebene klappt. Aber es dauert ca. 1000ms.
Ich kapier nicht ganz wie ich da das MIN einbauen soll:

SELECT v.current_time_stamp     FROM t_value_time AS v, t_mp_og AS m     WHERE v.mp_id = m.mp_id
    AND v.current_time_stamp BETWEEN '2010-05-01 00:00:00' AND '2010-05-01 23:59:59'     ORDER BY v.current_time_stamp ASC     LIMIT 1

Du meinst WHERE (SELECT MIN( und dann direkt die ID?

kurz:

where id = (select id from tab having max(timestamp));

HAVING akzeptiert nur bool als Argument, z.B. HAVING MIN(timestamp) < 123

Rein vom Algorithmus ist die ORDER BY Methode, die ich hier verwendet habe, extrem ineffizient. Ich will ja nur den kleinsten Wert suchen. Ein Array zu sortieren läuft selbst mit dem schnellsten Sortieralgorithmus im perfekten Fall (komplett vorsortiert) so lang wie der schlechteste Fall einer linearen Suche (jeder Wert einmal angeschaut). MIN klingt da schon besser. Nur check ich nicht wie ich es einbauen muss.

Eher so etwas:

select ... from ... where ... AND timestamp = (SELECT max(timestamp) FROM ... WHERE ...)

Für den Umweg über die ID braucht es wohl noch einen Subselect oder Join mehr.

Allein das hier:

SELECT min(current_time_stamp) 
FROM t_value_time
JOIN t_mp_og USING (mp_id)
WHERE og_id = '2939'

dauert 45 Sekunden :frowning:
Obwohl sowohl auf mp_id als auch current_time_stamp Indizes liegen.

und wie sieht es mit og_id aus ?

Es macht Sinn auf Spalten die oft abgefragt bzw gejoint werden Indezies zu legen.

Mit Index runter auf 16 Sekunden.