Laden...

Indizierung bei Group By zeigt keine Wirkung

Erstellt von prakti08 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.749 Views
P
prakti08 Themenstarter:in
321 Beiträge seit 2008
vor 11 Jahren
Indizierung bei Group By zeigt keine Wirkung

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.

1.378 Beiträge seit 2006
vor 11 Jahren

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

6.911 Beiträge seit 2009
vor 11 Jahren

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!"

C
2.121 Beiträge seit 2010
vor 11 Jahren

Für diese Abfrage könntest du ein WHERE Gleichheit > 0.98 einbauen, vielleicht bringt das was.

T
708 Beiträge seit 2008
vor 11 Jahren

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] **:::

6.911 Beiträge seit 2009
vor 11 Jahren

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!"