Barnabas 10 Geschrieben 22. April 2010 Melden Teilen Geschrieben 22. April 2010 Hallo zusammen, ich habe ein Problem mit der Ausführungsgeschwindigkeit einer Abfrage. Wenn ich diese Abfrage mit 2 unterschiedlichen Parametern aufrufe gibt es riesige Unterschiede in der Geschwindigkeit. Hier mal die Abfrage: SELECT kunde.Name, kunde.Strasse, kunde.Hausnr, kunde.Ort, kunde.Werbecode, kunde.Datensatz, kunde.StandortKz, kunde.PromotorNr, importiertam FROM kunde WHERE (((kunde.Name) In (SELECT [Name] FROM [kunde] As TMP2 WHERE (Dublette is null and werbecode = 'Stern 2010') GROUP BY [Name],[strasse],[Hausnr],[Ort],[Werbecode] HAVING Count(*)>1 And [strasse] = [kunde].[strasse] And [Hausnr] = [kunde].[Hausnr] And [Ort] = [kunde].[Ort] And [Werbecode] = [kunde].[Werbecode]))) and (Dublette is null) and werbecode = 'Stern 2010' ORDER BY kunde.Name, kunde.Strasse, kunde.Hausnr, kunde.Ort, kunde.Werbecode,LfdNr ; Die Ausführung dieser Abfrage dauert etwa eine Stunde! Wenn ich den Parameter 'Stern 2010' bspw durch 'Sonne 2010' ersetze, dauert die Abfrage keine 10 Sekunden, obwohl für den Parameter 'Sonne 2010' viel mehr Datensätze vorhanden sind. Zweimal konnte ich diesen "Fehler" durch einen Neustart des Servers beheben, doch seit neustem funktiniert auch das nicht mehr. Es ist ein MS SQL Server 2000 auf einem Windows 2003 Server. Ich bin dankbar für jeden Hinweis. Edit: So sehen die Statistiken für die Abfragen aus. Langsame Abfrage: Application Profile Statistics Timer resolution (milliseconds) 0 0 Number of INSERT, UPDATE, DELETE statements 0 0 Rows effected by INSERT, UPDATE, DELETE statements 0 0 Number of SELECT statements 2 2 Rows effected by SELECT statements 157 157 Number of user transactions 5 5 Average fetch time 0 0 Cumulative fetch time 0 0 Number of fetches 0 0 Number of open statement handles 0 0 Max number of opened statement handles 0 0 Cumulative number of statement handles 0 0 Network Statistics Number of server roundtrips 3 3 Number of TDS packets sent 3 3 Number of TDS packets received 11 11 Number of bytes sent 1472 1472 Number of bytes received 26043 26043 Time Statistics Cumulative client processing time 1 1 Cumulative wait time on server replies 1,01288e+008 1,01288e+008 Schnelle Abfrage: Application Profile Statistics Timer resolution (milliseconds) 0 0 Number of INSERT, UPDATE, DELETE statements 0 0 Rows effected by INSERT, UPDATE, DELETE statements 0 0 Number of SELECT statements 2 2 Rows effected by SELECT statements 41 41 Number of user transactions 5 5 Average fetch time 0 0 Cumulative fetch time 0 0 Number of fetches 0 0 Number of open statement handles 0 0 Max number of opened statement handles 0 0 Cumulative number of statement handles 0 0 Network Statistics Number of server roundtrips 3 3 Number of TDS packets sent 3 3 Number of TDS packets received 10 10 Number of bytes sent 1466 1466 Number of bytes received 22556 22556 Time Statistics Cumulative client processing time 1 1 Cumulative wait time on server replies 1,01903e+008 1,01903e+008 Zitieren Link zu diesem Kommentar
hh2000 10 Geschrieben 22. April 2010 Melden Teilen Geschrieben 22. April 2010 Moin, ich würde ggf. den SQL-String etwas verschlanken (HAVING). So z.B. (weiß aber nicht ob das Deine Anforderung abdeckt, hier wird nur der ältere Doppelte angezeigt, Dein Beispiel bringt wohl alle Doppelten zur Anzeige?): SELECT kunde.Name, kunde.Strasse, kunde.Hausnr, kunde.Ort, kunde.Werbecode, kunde.Datensatz, kunde.StandortKz, kunde.PromotorNr, importiertam FROM kunde WHERE kunde.[iD] In (SELECT MIN([iD]) FROM [kunde] As TMP2 WHERE [TMP2].[Dublette] is null and [TMP2].[werbecode] = 'Stern 2010' GROUP BY [Name],[strasse],[Hausnr],[Ort],[Werbecode] HAVING Count(*)>1 ) ORDER BY kunde.Name, kunde.Strasse, kunde.Hausnr, kunde.Ort, kunde.Werbecode,LfdNr Welches Service Pack (SQL) ist installiert (SELECT @@VERSION)? Gruß Kai Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 22. April 2010 Autor Melden Teilen Geschrieben 22. April 2010 (bearbeitet) Hallo Kai, erstmal Danke für deine Antwort. Eine Verschlankung bringt auch nichts. Ich hab die Abfrage schon auf die wesentlichsten Merkmale reduziert, der Effekt ist der gleiche. Vor 3 Tagen dauerte die Abfrage noch etwa 3 Sekunden, jetzt ist es eine Stunde. Alle anderen Views, Prozeduren, Tabellen laufen in normaler Geschwindigkeit. Es ist nur diese eine Abfrage mit einem bestimmten Parameter. Die genaue Version ist "Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright © 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) ". Edit: Sehe gerade dass es ja schon SP4 gibt. Werde das mal laden und installieren. Edit2: SP4 bringt auch keine Veränderung. bearbeitet 23. April 2010 von Barnabas Zitieren Link zu diesem Kommentar
hh2000 10 Geschrieben 23. April 2010 Melden Teilen Geschrieben 23. April 2010 Ja teste mal bitte SP4. (Datensicherung, Hersteller Einverständnis ok?) Ich hatte bei einem ähnlichem Problem auf einer 2-Prozessormaschiene ohne SP4, als Workaround SQL auf einen Prozessor beschränken müssen. Allerdings war im SQL-Server Protokoll ein Hinweis darauf zu finden (etwas mit "Parallelism", "Deadlock", genauen Text hab ich nicht mehr). Dort wurde auch eine geschachtelte Abfrage u.a. mit Join auf sich selbst auf verschiedene Threads verteilt, die sich dann gegenseitig blockierten, aber eben nicht bei allen Werten. Du kannst evtl. zum testen die Abfrage auch mit MAXDOP "optimieren". max degree of parallelism Option SELECT Spalte(n) FROM Table OPTION (MAXDOP 1) Die Ausstattung war NT4 mit SQL 2000 SP3, SP4 war dort nicht möglich. Gruß Kai EDIT: ich war zu langsam .... Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. April 2010 Melden Teilen Geschrieben 23. April 2010 Moin, was passiert denn, wenn du einfach nur die Datensätze mit "Sonne 2010" abfragst und die mit "Stern 2010" - ohne das Klimbim drumrum? SELECT * FROM Kunde WHERE werbecode = 'wert' Auch diese gravierenden Unterschiede? Sind die relevanten Felder indiziert? Hast du die Statisktiken mal aktualisiert? Gruß, Nils Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 23. April 2010 Autor Melden Teilen Geschrieben 23. April 2010 Die einfachen Abfragen auf die Kriterien sind schnell, in der Regel ~1 Sekunde. Für "Sonne" gibt es etwa 90.000 Datensätze, für "Sterne" etwa 60.000, also auch keine großen Mengen. Indizes liegen auf den wichtigen Feldern. Ungewöhliche/fehlerhafte Datensätze konnte ich auch nicht finden. Was meinst du mit Statistiken aktualisieren? Nochmal erstellen? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. April 2010 Melden Teilen Geschrieben 23. April 2010 Moin, UPDATE STATISTICS Gruß, Nils Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 23. April 2010 Autor Melden Teilen Geschrieben 23. April 2010 Hallo Nils, hat leider auch nichts gebracht. Alle anderen Abfragen funktionieren, auch diese Abfrage funktioniert wenn der übergebene Wert nicht "Stern 2010" lautet. Kann es sein dass ein Datensatz in der DB diese Verzögerungen bewirkt? Was könnte da nicht stimmen? Beim letzten Ausführen der Abfrage habe ich gesehen dass dabei ein Prozessor von vieren zu fast 100% ausgelastet ist, die anderen fast gar nicht. Ist das normal oder läuft da evtl etwas schief? Ich stochere ratlos im Nebel... Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. April 2010 Melden Teilen Geschrieben 23. April 2010 Moin, kannst du Probleme auf dem Storage ausschließen? Vielleicht liegt einer der gesuchten Datensätze physisch in einem beschädigten Datenbereich. Wenn die DB nicht allzu groß ist, könntest du mal ein Backup auf ein Testsystem übertragen und schauen, ob das Phänomen dort auch auftritt. Tritt der Effekt identisch bei lokaler und entfernter Ausführung der Abfrage auf? Gruß, Nils Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 23. April 2010 Autor Melden Teilen Geschrieben 23. April 2010 Ausschließen kann ich Probleme mit den Platten nicht, aber zumindest zeigt mir der "Dell OpenManage Server Administrator" keine Probleme an. Ob ich die Abfrage lokal oder entfernt ausführe macht keinen Unterschied. Ich kopiere die Kunden-Tabelle nun mal auf einen anderen Server, mal sehen wie es sich dort verhält. Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 26. April 2010 Autor Melden Teilen Geschrieben 26. April 2010 Auf einem anderen Server habe ich den gleichen Effekt. Liegt es also doch an den Daten? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 26. April 2010 Melden Teilen Geschrieben 26. April 2010 Moin, sieht danach aus. Wie hast du denn die Tabelle kopiert? Gruß, Nils Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 26. April 2010 Autor Melden Teilen Geschrieben 26. April 2010 Ich habe einmal eine Sicherung auf dem anderen Server eingespielt und einmal die Daten per Assistent rüberkopiert. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 26. April 2010 Melden Teilen Geschrieben 26. April 2010 Moin, hm. OK. Das hat in jedem Fall auch neue Datenstrukturen erzeugt. Da bin ich mit meinem Latein leider am Ende. Wenn es wirklich dieselben Abfragen sind, die du benutzt, kann ich mir das Verhalten nicht erklären. Gruß, Nils Zitieren Link zu diesem Kommentar
Barnabas 10 Geschrieben 27. April 2010 Autor Melden Teilen Geschrieben 27. April 2010 Wenn ich alle Datensätze mit dem Kennzeichen 'Stern 2010' in eine Kopie der Kundentabelle kopiere und die Abfrage auf diese neue Tabelle starte, dauert diese keine 3 Sekunden. Dann scheint es ja auch nicht an den Daten zu liegen. Ich bin echt ratlos... Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.