Oracle LIMIT (Äquivalent) & ORDER BY

Dieses Thema im Forum "SQL und Datenbanken" wurde erstellt von nighT, 01.02.2011.

  1. nighT

    nighT Guest

    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. daboss

    daboss Keine Macht für niemand!

    Dabei seit:
    05.01.2007
    Beiträge:
    1.294
    Zustimmungen:
    0
    Ort:
    sydney.australia.world
  4. #3 saeckereier, 01.02.2011
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    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.
     
  5. daboss

    daboss Keine Macht für niemand!

    Dabei seit:
    05.01.2007
    Beiträge:
    1.294
    Zustimmungen:
    0
    Ort:
    sydney.australia.world
    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:
     
  6. #5 saeckereier, 01.02.2011
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    daboss: war auf den Eröffnungspost bezogen, nicht auf deinen Post. Auf die Reihenfolge der Aktionen hat man aber auch keinen Einfluss..
     
  7. nighT

    nighT Guest

    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?
     
  8. #7 saeckereier, 02.02.2011
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    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..
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. nighT

    nighT Guest

    @saeckereir: Nein dieses Feld ist >nicht< in der DB vorhanden. Mir ist bewusst, dass dieses "Feld" die Ergebnisse durchnummeriert.
    Darum:
    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?
     
  11. #9 saeckereier, 03.02.2011
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    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...
     
Thema: Oracle LIMIT (Äquivalent) & ORDER BY
Besucher kamen mit folgenden Suchen
  1. oracle anzahl datensätze auf 1 begrenzen

Die Seite wird geladen...

Oracle LIMIT (Äquivalent) & ORDER BY - Ähnliche Themen

  1. Oracle muss wegen Java zu Kreuze kriechen

    Oracle muss wegen Java zu Kreuze kriechen: Der amerikanische Softwarehersteller Oracle einigete sich mit der US-Handelsbehörde FTC darauf, dass sich das Unternehmen öffentlich der...
  2. Oracle reanimiert Linux-SPARC-Unterstützung

    Oracle reanimiert Linux-SPARC-Unterstützung: Nachdem mit Debian eine der letzten großen Distributionen die Unterstützung der SPARC-Plattform aufgekündigt hat, hat Oracle eine eigene...
  3. Oracle reanimiert Linux-SPARC-Unterstützung

    Oracle reanimiert Linux-SPARC-Unterstützung: Nachdem mit Debian eine der letzten großen Distributionen die Unterstützung der SPARC-Plattform aufgekündigt hat, hat Oracle eine eigene...
  4. Oracle integriert Docker in Solaris

    Oracle integriert Docker in Solaris: Bereits seit 2005, lange vor dem derzeitigen Container-Hype, kennt Solaris das Prinzip der Solaris-Zonen. Oracle möchte in einer kommenden...
  5. Oracle Linux 6.7 veröffentlicht

    Oracle Linux 6.7 veröffentlicht: Wie der Soft- und Hardwarehersteller Oracle bekannt gab, ist das neueste Update seiner Red Hat Enterprise-basierten Distribution nun für 32- und...