Benutzer mit den meisten Antworten
SQL Updateabfrage via VB.net ist sehr langsam

Frage
-
Hallo,
ich habe ein Problem bezüglich einer Updateabfrage welches von meinem Programm (mit VB.net geschrieben) aus gestartet wird.
Und zwar müssen ca. 1000 - 1500 Datensätze aktualisiert werden. Zuerst hatte ich die Abfrage direkt im Quellcode, da war es auch schon extrem langsam (30 - 45 sek für 1 Datensatz). Da dachte ich das, wenn ich die Abfrage als Stored Procedure, in die Datenbank auslager die Performance gebessert wird. Aber es ist immer noch das selbe Problem. Die Abfrage sieht so aus:@EK as float, @VK as float, @Mandant as nvarchar(max), @Wirtschaftsjahr as int, @Artikelnr as nvarchar(max), @Lieferantenartikelnr as nvarchar(max), @Status as nvarchar(max), @Lieferantennr as nvarchar(max), @Preisart as nvarchar(max) AS BEGIN if @Preisart = '11' Begin Update t043 set c013 = @EK where mesocomp = @Mandant and mesoyear = @Wirtschaftsjahr and (c000 like @Artikelnr or c000 like (Select c002 from t024 where mesocomp = @Mandant and mesoyear = @Wirtschaftsjahr and c115 = @Artikelnr)) and c001 = '11' and c002 = 1 End if @Preisart = '1' Begin Update t043 set c013 = @VK where mesocomp = @Mandant and mesoyear = @Wirtschaftsjahr and (c000 like @Artikelnr or c000 like (Select c002 from t024 where mesocomp = @Mandant and mesoyear = @Wirtschaftsjahr and c115 = @Artikelnr)) and c001 = '1' and c002 = 1 End if @Preisart = '13' begin Update t043 set c013 = @VK, c015 = @Lieferantenartikelnr, c017 = @Status where mesocomp = @Mandant and mesoyear = @Wirtschaftsjahr and c000 like @Artikelnr or (c000 like (Select c002 from t024 where mesocomp = @Mandant and mesoyear = @Wirtschaftsjahr and c115 = @Artikelnr)) and c001 = '13' and c002 = 1 and c003 = @Lieferantennr end END
Im Quellcode wird dann auf die Prozedur zugegriffen und die Parameter übergeben. Ich habe keine Ideen mehr woran es liegen kann. Select- und Insert-Abfragen werden schnell bearbeitet nur das Update macht Probleme. Die Tabelle auf die ich Zugreife kann ich leider nicht vom Aufbau her ändern. Diese besteht aus insgesamt 49 Spalten, aber ich weiß nicht genau ob das irgendwie bei der Lösungssuche hilft.
Ich hoffe jemand von euch hat einen Lösungsansatz und kann mir weiter helfen!
Liebe Grüße
Antworten
-
Hallo Marion,
die grüne Textzeile gibt dir schon mal einen guten Hinweis auf eine mögliche Problemstelle.
Die SQL Spezis hier werden dir sicher bessere Tipps geben können, ich für meinen Teil würde empfehlen, den genannten Index mal testweise anzulegen und zu schauen, ob es damit besser geht. Klick hierfür mal mit der rechten Maustaste auf die grüne Zeile und wähle den Kontextmenüpunkt "Fehlende Indexdetails...". Man sollte natürlich nicht wild irgendwelche Indizes erzeugen ohne sich darüber im klaren zu sein, was das letztendlich für Auswirkungen hat, testen solltest Du es IMHO aber trotzdem mal damit.
Alternativ müsste man ggfs. das SQL Statement bzw. die WHERE Klausel umbauen, wie genau die dann aber aussehen muss, kann ich dir ohne eine detaillierte Darstellung der Tabelle inkl. bereits vorhandener Indizes nicht sagen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Marion.M Dienstag, 2. Juli 2013 13:44
Alle Antworten
-
Hallo Marion,
auf den ersten Blick fällt mir auf, dass Du bei c000 immer LIKE verwendest. Ändere das mal bitte in = oder IN. Denn einen Grund für LIKE sehe ich da nicht.
Dazu solltest Du dir auch mal den Ausführungsplan für die Abfrage anschauen, evtl. ergibt sich daraus der Flaschenhals.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 2. Juli 2013 11:39 Grund
-
Hallo Stefan,
also ich habe mal das LIKE durch = ersetzt. Bei meinem ersten Durchlauf nach der Änderung ging es auch relativ flott. Jetzt bei dem zweiten ist er aber wieder langsamer, braucht ca 5 sek pro Datensatz. Zwar schneller als vorher aber dennoch relativ langsam.
Ich habe mir mal so einen Ausführungsplan dazu erstellt (zum ersten Mal) aber wirklich schlau werde ich daraus nicht. Aber es scheint mir so, als wäre die Subselect-Abfrage der Bösewicht: http://social.msdn.microsoft.com/Forums/getfile/304017Nur wüsste ich jetzt nicht wie ich das beheben kann. Ich benötigte die Subselect-Abfrage.
- Bearbeitet Marion.M Dienstag, 2. Juli 2013 13:02 Bild-URL
-
Hallo Marion,
die grüne Textzeile gibt dir schon mal einen guten Hinweis auf eine mögliche Problemstelle.
Die SQL Spezis hier werden dir sicher bessere Tipps geben können, ich für meinen Teil würde empfehlen, den genannten Index mal testweise anzulegen und zu schauen, ob es damit besser geht. Klick hierfür mal mit der rechten Maustaste auf die grüne Zeile und wähle den Kontextmenüpunkt "Fehlende Indexdetails...". Man sollte natürlich nicht wild irgendwelche Indizes erzeugen ohne sich darüber im klaren zu sein, was das letztendlich für Auswirkungen hat, testen solltest Du es IMHO aber trotzdem mal damit.
Alternativ müsste man ggfs. das SQL Statement bzw. die WHERE Klausel umbauen, wie genau die dann aber aussehen muss, kann ich dir ohne eine detaillierte Darstellung der Tabelle inkl. bereits vorhandener Indizes nicht sagen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Marion.M Dienstag, 2. Juli 2013 13:44