Zum Inhalt springen

Performanceproblem bei SQL-Abfrage


Gawan

Empfohlene Beiträge

Hallo zusammen,

ich hab hier ein Riesenproblem mit der Performance einer Abfrage und ich komm einfach nicht weiter.

Ich habe eine Tabelle dbo.GR mit den 150000 Zeilen und den Spalten

Vendor (Varchar)

OrderNo (Varchar)

GRNo (Varchar)

GRDate (Varchar)

Qty (Int)

Es handelt sich dabei um Wareneingangsbuchungen (eindeutig durch GRNo identifiziert) zu Bestellungen (OrderNo). Das wesentliche ist, dass es zu jeder OrderNo mehrere GRNo'S geben kann.

Ich möchte eine Abfrage die mir für jede OrderNo die Summe der Wareneingänge (Qty),das aktuellste Wareneingangsdatum (GrDAte), und einen indikator ob mehr als ein Wareneingang gebucht wurden, errechnet.

Meine Abfrage:

select sum(qty) as sumqty,  -- Summe der gebuchten Mengen

orderno, max(grDate) as grDateMax, -- aktuellsten Buchungsdatum

case when count (distinct grdate) > 1 then 1 else 0 end as part_del 

from dbo.gr

where qty > 0

group by orderno 

Die Abfrage dauert fast eine ganze Minute und ich habe keine Ahnung wer wie ich das noch optimieren kann ... kann mir da eventuell jemand von euch einen Tipp geben ?

Besten Dank

Gawan

Link zu diesem Kommentar
Auf anderen Seiten teilen

als erstes wuerd ich dir vorschlagen indexe auf die tabelle zu setzen

Als erstes würde ich mal vorschlagen dies nicht zu tun, sondern nachfragen, wieviele Einträge es denn gibt, die auf die WHERE Bedingung zutreffen und ob die WHERE Bedingung fest ist oder auch verändert werden kann.

In diesem Fall sollte auch analysiert werden, wieviele Datensätze (prozentual) im Mittel für die WHERE Bedingung zutreffen.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mhm,

du könntest hingehen, und gewisse grenzen setzen, was die aktualität von deinem Query angeht.

Als Bleistift :

max(grDate) as grDateMax, -- aktuellsten Buchungsdatum

Da haste erstmal ne skalar function, wo jedes mal geprüft wird was das aktuelle neueste Buchungsdatum ist. Wenn du jetzt hingehst, und dir täglich (nachts) per job ne Tabelle füllst, mit den aktuellsten Buchungsdaten deines Wareneingangsm, dann haste auf einen Tag genau das Datum direkt stehen.

Das könntest du dann direkt per join auslesen, was weniger Rechenzeit braucht wie die Funktion. Der nachteil ist, dass du dann immer nur auf der Basis von der Zeit ausgehst, zu der der Job läuft.

Der Vorteil ist, je weiniger funktionen du verwenden musst, je weniger wird gerechnet -> schneller.

Ansonsten .... Indize auf den Feldern die du joinst wär das erste was ich mal tun würde.

Gruß

Sven

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aus dem dbo. schließe ich das du einen SQL Server verwendest? Welche Version?

Gehen wir mal davon aus das du keinen Index hast und die Abfrage nicht optimiert ist (hier gibts natürlich sehr viel Optimierungspotentzial) - der SQL Server darf im Normalfall trotzdem nur wenige Sekunden dafür brauchen, mit deinem Server stimmt also vermutlich auch etwas nicht.

mach mal ein select * auf die Tabelle und führe dann die gleiche Abfrage nochmal aus. Wenn der Server genügend RAM hat muss er durch das select * from table die komplette Tabelle in Memory gecached haben und es ist kein Plattenzugriff mehr nötig, die Abfrage sollte auf einem halbwegs aktuellen Rechner dann vielleicht noch 2 Sekunden benötigen. Wenn das nicht der Fall ist:

Wie viel RAM hat der Server?

Wie viel Speicher ist frei?

Wie groß ist die Datenbank?

Auf welchen Speicherverbrauch ist der SQL Server konfiguriert?

Passiert auf dem Server während deiner Abfrage noch was anderes?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...