none
SQL Updateabfrage via VB.net ist sehr langsam RRS feed

  • 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

    Dienstag, 2. Juli 2013 10:54

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
    Dienstag, 2. Juli 2013 13:07
    Moderator

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


    Dienstag, 2. Juli 2013 11:38
    Moderator
  • 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/304017

    Nur 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
    Dienstag, 2. Juli 2013 13:01
  • 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
    Dienstag, 2. Juli 2013 13:07
    Moderator
  • Hallo Stefan,

    Wahnsinn es hat funktioniert! Nachdem ich das Indizes erstellt hatte läuft die Updateabfrage rasend schnell durch. Darauf wäre ich nie gekommen. Wieder was dazu gelernt :)

    Lieben Dank und viele Grüße

    Marion

    Dienstag, 2. Juli 2013 13:44