Gawan Geschrieben 17. November 2009 Teilen Geschrieben 17. November 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 17. November 2009 Teilen Geschrieben 17. November 2009 als erstes wuerd ich dir vorschlagen indexe auf die tabelle zu setzen Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 18. November 2009 Teilen Geschrieben 18. November 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 18. November 2009 Teilen Geschrieben 18. November 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 19. November 2009 Teilen Geschrieben 19. November 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.