Jump to content

Geschwindigkeitsunterschiede


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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 von Barnabas
Link zu diesem Kommentar

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 ....

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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...

Link zu diesem Kommentar

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

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...