Oracle LIMIT (Äquivalent) & ORDER BY

N

nighT

Hallo Leute,

ich habe die Aufgabe ein Oracle-Statement zu bauen, welches die neusten Events geordnet aus einer DB ausließt.
Die Anzahl und die Sortierung ist variabel und wird per PHP in das Statement eingebaut.
Folgende Spalten sollen abgerufen werden:
Code:
rownum, ActionTime, ActionCode, Serial, FirstOccurrence, Summary, LastOccurrence, StateChange, Acknowledged, Severity
Das ganze sollte zuerst die Einträge beschränken (z.B. nur die letzten 100 Einträge) und dann nach ActionTime sortieren.
In der Priorität kommt also das Limit vor dem Sortieren.
Sprich: Es werden immer die gleichen, letzten (z.b. 100) Events ausgegeben und diese werden dann nach der ActionTime ASC oder DESC sortiert.

Später wird das Statement auf einer Seite verwendet. Dort kann ein Filter und eine Sortierung gesetzt werden. Das Ergebnis würde ich gerne direkt per Statement bearbeiten, da die Datenbank über 777000 Events beinhaltet.

Es darf auch gerne eine andere Lösung sein. Allerdings nicht zu Performencelastig (bei über 777000 Einträgen)...

mfg nighT
 
Was ist das denn für eine Reihenfolge? Erst limit dann sortieren? Das kann doch gar nicht sinnvoll sein. In einer relationalen Datenbank gibt es erstmal gar keine Reihenfolge der Sätze und damit auch keine Garantie, dass zwei Selects die Ergebnisse in der gleichen Reihenfolge liefern. In der Regel mag das so sein, aber darauf darf man sich nicht verlassen. Es kann daher, wenn es auf die *neuesten* Ereignisse ankommt nur ein Sortieren und dann ein Abschneiden sinnvoll sein. Wie die DB das effizient löst ist dann natürlich ihre Aufgabe.
 
Vom Link übernommen: :rtfm:

Code:
SELECT * FROM
(SELECT t.field1, t.field2 FROM table t
ORDER BY t.field2 DESC)
where rownum <= 30

Imho sortiert er doch zuerst und kappt erst dann? Oder beziehst du dich garnicht darauf? Oder steh ich so früh am morgen noch auf'm Schlauch? :think:
 
daboss: war auf den Eröffnungspost bezogen, nicht auf deinen Post. Auf die Reihenfolge der Aktionen hat man aber auch keinen Einfluss..
 
Ich versuche den Sachverhalt nochmal genauer zu beschreiben:
In dieser Datenbank landen täglich mehrere 1000 Events.
Da allerdings immer nur die aktuellsten interessieren würde ich zuerst diese rausziehen und dann Filtern.
Zuerst zu Filtern bringt in die eine Richtung den gewünschten Erfolg, in die andere Richtung allerdings sehe ich dann die ältesten Events ganz oben. Diese sind allerdings unrelevant.

@saeckereier: Die gelieferte Reihenfolge mag wohl nicht sehr verlässlich sein, doch wie kann ich sie verlässlich machen?
Die Events kommen unregelmäßig (zeitlich gesehen) und ohne eindeutige ID (als Reihenfolge) in die Datenbank.

@daboss: Dein Code liefert mir ebenfalls in die eine Richtung die aktuellsten Events (absteigend deren Daten), in die andere Richtung dann (aufsteigend deren Daten) aber wieder die ältesten Events in der Datenbank.

Mit folgendem Code habe ich die Möglichkeit mein Ziel zu erreichen:
Code:
Select rownum, ActionTime, ActionCode, Serial, FirstOccurrence, Summary, LastOccurrence, StateChange, Acknowledged, Severity from status where rownum<=777368
MINUS
Select rownum, ActionTime, ActionCode, Serial, FirstOccurrence, Summary, LastOccurrence, StateChange, Acknowledged, Severity from status where rownum<777268 ORDER BY ActionTime ASC;
Nun muss das ganze nur dynamisch werden. Aktuell gebe ich feste Rownums an. Da die Abfrage aber unterschiedlich groß sein soll und es auch ständig mehr Events werden muss ich die Anzahl der vorhandenen Events ermitteln. Wie schaffe ich sowas?
 
night: Du schreibst in dem ersten Post, dass die Spalte rownum mit abgerufen wird, deine Tabelle hat hoffentlich keine solche Spalte oder? In Oracle ist rownum eine spezielle Spalte, über die die Ergebnisse durchnummeriert werden..

Um dein Problem zu lösen gibt es mehrere Wege. Aber alle haben gemeinsam, dass du zuerst die Einträge sortiert nach Datum absteigend abrufen musst und dann nur die ersten x Zeilen behälst (=> die neuesten x Zeilen). Anschließend kannst du entweder ein zweites Select darum bauen und andersrum sortieren lassen oder du sortierst in dem Programm, das die Daten weiterverarbeitet nochmal. Für ein paar hundert Einträge ist das eigentlich egal..
 
@saeckereir: Nein dieses Feld ist >nicht< in der DB vorhanden. Mir ist bewusst, dass dieses "Feld" die Ergebnisse durchnummeriert.
Darum:
nigHT schrieb:
und ohne eindeutige ID (als Reihenfolge) in die Datenbank.

Bei wenigen hundert Einträgen wäre das kein Problem.
Problematisch wird es, wenn mehrere 1000 Einträge abgerufen werden.
Allerdings werde ich mal testen, wie sich das Sortieren per PHP-Skript auf die Performence auswirkt. Theoretisch sollte es ja funktionieren, wenn ich den Array (mit den Events) einmal per array_reverse und einmal quasi orginal aus der Datenbank zurückgebe.
Dann wäre das SQL Statement immer gleich, nur würde ich dann je nach dem ob ASC oder DESC das Ergebnis per array_reverse zurückgeben.
Ist die Annahme soweit korrekt?
 
Ja, das mit dem Array-Reverse ist gar nichtmal so dumm, du müsstest ja nichtmal mehr sortieren, denn die Einträge sind ja bereits sortiert. Gute Idee.. Das dürfte dann natürlich von der Performance noch deutlich besser sein und wirklich kein Problem darstellen...
 
Zurück
Oben