Anmelden

View Full Version : MAX in SQL mit Datum Zeit und Suffix



Seiten : 1 [2]

Pikachu
09-10-08, 12:14
Anderer Vorschlag:
SELECT *
FROM DATTIMP
WHERE (LAGERORT,ARTIKEL,DATUM,ZEIT) IN (
SELECT LAGERORT,ARTIKEL,DATUM,MAX(ZEIT)
FROM DATTIMP
WHERE (LAGERORT,ARTIKEL,DATUM) IN (
SELECT LAGERORT,ARTIKEL,MAX(DATUM)
FROM DATTIMP
WHERE LAGERORT='LO'
AND DATUM BETWEEN 20080901 AND 20080930
GROUP BY LAGERORT,ARTIKEL)
GROUP BY LAGERORT,ARTIKEL,DATUM)
ORDER BY LAGERORT,ARTIKEL,DATUM,ZEIT

kitvb1
10-10-08, 07:00
@Fuerchau,

Tjcha, da haben Sie vollkommen recht, weiss ich auch nicht ich da gedacht habe. Senioren moment? ;)

Fuerchau
10-10-08, 09:06
Da fragt sich, wer denn hier der Senior ist ;).
Funktionierts denn jetzt endlich ?

kitvb1
10-10-08, 10:07
Was ich als zweckpunkt gewollt habe, ist die möglichkeit besteht um es
ohne max(...)
mit nutzung von
order by... /desc
fetch first/last
auch schaffen kann.
Dazu wollte ich auch fragen, welche läuft schneller? Mit max(...) oder fetch first?

Fuerchau
10-10-08, 10:23
Wenn entsprechende Zugriffswege vorhanden sind, ist fetch first schneller.
Das setzt aber auch einen DESC-Key voraus, denn ich weiß nicht, ob der Optimizer ggf. auch rückwärts optimiert.

Bei zusammengesetzten Feldern erübrigt sich ja eigentlich die Frage ;).

B.Hauser
10-10-08, 11:03
Hey Kit,


Was ich als zweckpunkt gewollt habe, ist die möglichkeit besteht um es
ohne max(...)
mit nutzung von
order by... /desc
fetch first/last
auch schaffen kann.
Dazu wollte ich auch fragen, welche läuft schneller? Mit max(...) oder fetch first?

Werden die Abfragen mit den SQE ausgeführt und wird jeweils nur der Maximal-Wert selektiert, wird der gleiche Zugriffsplan verwendet, d.h. Zeitabweichungen hängen lediglich von der Auslastung auf der Maschine ab.

Die folgenden Abfragen werden original gleich ausgeführt. Es existiert ein Zugriffsweg nach FldX.


Select Max(Fldx)
From MyTable;




Select FldX
from MyTable
Order By FldX Desc
Fetch First Row Only;




Das setzt aber auch einen DESC-Key voraus, denn ich weiß nicht, ob der Optimizer ggf. auch rückwärts optimiert.

Die CQE braucht eine absteigend sortierten Zugriffspfad (in beiden Fällen!). SQE kann eine Zugriffsweg auch rückwärts verarbeiten.

Wird die Abfrage mit der CQE ohne entsprechenden Zugriffsweg verarbeitet, ist die Variante mit der Aggregat-Funktion (MAX) wesentlich schneller als die Variante mit dem Fetch! In der Fetch Variante wird eine temporäre Datei gebildet während bei der anderen Variante gruppiert werden kann.

Bei entsprechend sortiertem Zugriffsweg wird dieser bei der Fetch-Variante verwendet, während im anderen Fall weiterhin ein Table Scan mit Grouping verwendet wird.


Bei zusammengesetzten Feldern erübrigt sich ja eigentlich die Frage

Vor 6.1 ja, ab 6.1 können auch Indices über zusammengesetzte Felder oder durch skalare Funktionen veränderte Felder gebildet werden. Diese Indices können dann auch vom Optimizer verwendet werden.

Birgitta

Pikachu
10-10-08, 11:12
Liefert FETCH FIRST nicht nur einen einzigen Datensatz je Abfrage zurück? Du brauchst doch aber mehrere Datensätze, für jeden Artikel je Lagerort einen?

Fuerchau
10-10-08, 12:34
Ich glaub jetzt sind wir weit am Thema vorbei.
Fetch first löst natürlich nicht obiges ursprüngliches Problem.