Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

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?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.