verwendetes Datenbanksystem: <oracle 11g>
Hallo,
es handelt sich um eine Aufgabe die ich bearbeiten muss:
SELECT User, MAX(Gleichheit)
FROM TAbelle
GROUP BY User
HAVING MAX(Gleichheit) > 0.98
Dazu soll ein Index angelegt werden, welcher die Abfrage beschleunigen soll.
Ich habe mir gedacht das ein index über (Gleichheit,User) beschleunigend wirken würde. Nach einem Blick in Explain_Plan ändert sich aber zur ursprünglichen Anfrage nichts.
Daraufhin habe ich alle möglichen Indezes erstellt (Gleichheit),(User),(User,Gleichheit),(Gleichheit,User) und den explain_plan ausgeführt.
Auch hier wieder keine Änderung.
Habe ich einen Denkfehler oder ist es nicht möglich diese Abfrage zu beschleunigen?
Vielen Dank für eure Hilfe
prakti
Use the source, Luke!
Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.
Um wieviele Datensätze handelt es sich denn? Vorher und Nach der Gruppierung? Und wielange dauern deine Abfragen bzw. was erhoffst du dir an Performanzgewinn?
Ich bin kein Indizierungsspezialist was meine kläglichen Versuche, meine Datenbank zu optimieren, bestätigen. Wenn es in dem Fall mit Indizierungen nicht hinhaut, kannst du versuchen eine zweite Tabelle anzulegen, welche direkt das Ergebnis deiner Abfrage enthält. Also bereits gruppiert. Hier muss man halt schauen, wo der beste Zeitpunkt fürs "Cachen" der aggregierten Daten liegt.
Lg, XXX
Hallo prakti08,
guck mal: Group By Indizieren | SQL Performance Explained Ich denke damit kommst du auf den richtigen Weg. Wegen der guten Hintergrundinfos ist es so besser, als direkt die Antwort hierher zu schreiben.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Für diese Abfrage könntest du ein WHERE Gleichheit > 0.98 einbauen, vielleicht bringt das was.
Für diese Abfrage könntest du ein WHERE Gleichheit > 0.98 einbauen, vielleicht bringt das was.
Definitiv bringt das etwas. Das HAVING lässt sich alle Datensätze von der Datenbank übermitteln und wendet anschließend auf das Ergebnis den Filter an.
Das WHERE sendet den Filter gleich an die Datenbank und bekommt das schon gefilterte Ergebnis zurückgeliefert.
Je nach Datenmenge wird das einen riesen Unterschied machen, da zum einen der schnellere Datenbank-Server die Arbeit übernimmt und zum anderen die zu übertragende Datenmenge deutlich kleiner ist.
Ein Index auf User wäre trotzdem sicherlich nicht das verkehrteste, wenn die Änderung auf das WHERE nicht ausreichend Performance bringt.
(_Der MSSQL-Server würde den ~~Schlüssel[\S] Index selbst anlegen, wenn die Abfrage ein paar male ausgeführt wird. Der ist recht lernfähig. Wie das genau bei Oracle funktioniert weiß ich leider nicht.[/i])
**[EDIT] **:::
Hallo trib,
Der MSSQL-Server würde den Schlüssel selbst anlegen,
Statt Schlüssel meinst du wohl Index bzw. Statistik.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"