Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Indizierung bei Group By zeigt keine Wirkung
prakti08
myCSharp.de - Member



Dabei seit:
Beiträge: 321
Herkunft: Trier

Themenstarter:

Indizierung bei Group By zeigt keine Wirkung

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von prakti08 am .
Use the source, Luke!




Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.814
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.102

beantworten | zitieren | melden

Für diese Abfrage könntest du ein WHERE Gleichheit > 0.98 einbauen, vielleicht bringt das was.
private Nachricht | Beiträge des Benutzers
trib
myCSharp.de - Member



Dabei seit:
Beiträge: 690

beantworten | zitieren | melden

Zitat von chilic
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] Danke gfoidl, hab ich geändert. Da war ich wohl auf einem Auge blöd...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von trib am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.814
Herkunft: Waidring

beantworten | zitieren | melden

Hallo trib,
Zitat
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!"
private Nachricht | Beiträge des Benutzers