MS SQL - unperformante Query - WITH gejointe Tabelle erhöht Abfragedauer um 50

Mitglied: c0nsp1r4cy

c0nsp1r4cy (Level 1) - Jetzt verbinden

21.10.2020, aktualisiert 09:20 Uhr, 667 Aufrufe, 7 Kommentare

Guten Morgen allerseits,

MS SQL Server 2008, Microsoft SQL Server Management Studio 10.50.1600.1

ich versuche derzeit eine wirklich schrecklich unperformante Query zu optimieren (ca. 80.000 Datensätze).

Geringfügig gelang mir das auch bereits durch das Spielen und Ersetzen von Joins durch SubQueries und umgekehrt sowie weiterer kleinerer Syntaxspielereien.

Die abgefragten Spalten habe ich sukzessive auskommentiert, Abfrage ausgeführt, Ergebnis notiert und so die strittigen Stellen identifiziert.

Schließlich war ich bis zu einem bestimmten Punkt zufrieden, weil die Ausführungszeit der Query von 18s bei allen Datensätzen auf 4s reduzieren konnte.

Nun wollte ich den letzten Part angehen:

und stattdessen eine temporäre Tabelle mittels WITH erzeugen:
Dieser Part führt zu einem Anstieg der Abfragezeit von 4s auf 10s-11s.

Komplette Abfrage nach Anpassungen:
- Konvertiererei problematisch? Ich meine hier geringfügig verschleuderte Performance festzustellen.
- Stringmanipulationen ungünstig?

Standardindexe (SAP-Tabellen) sind überall vorhanden.

Ist es möglich der temporären Tabelle, die über WITH gejoint wird, einen INDEX zu verpassen? Würde das überhaupt etwas bringen?

Über Hilfe würde ich mich freuen!

Vielen Dank vorab!
Mitglied: akretschmer
21.10.2020 um 09:05 Uhr
ich hab mir jetzt nicht die komplette query durchgelesen (sie scheint eh nicht komplett zu sein), aber kurze Frage: welche Version?

Ab PG12 kann PG WITH-Abfragen sinnvoll optimieren, vorher wurde immer alles materialisiert, was u.U. massiv auf die Performance geht.

Ach ja, ein EXPLAIN (ANALYSE, BUFFER) wäre sinnvoll ...
Bitte warten ..
Mitglied: c0nsp1r4cy
21.10.2020, aktualisiert um 09:34 Uhr
Sorry, ja - Frage ergänzt.

Die Query ist komplett.

Ich habe keine Ahnung von den Analysetools oder wie sie zu benutzen sind.

Den ExecutionPlan habe ich mal erstellt, aber wirklich schlau werde ich daraus eben nich. Im Grunde weiss ich ja, wo es klemmt?
Bitte warten ..
Mitglied: akretschmer
21.10.2020 um 10:00 Uhr
Ah, das ist M$SQL? Ich bin raus ...
Bitte warten ..
Mitglied: mbehrens
21.10.2020 um 11:15 Uhr
Zitat von c0nsp1r4cy:

Ich habe keine Ahnung von den Analysetools oder wie sie zu benutzen sind.

Den ExecutionPlan habe ich mal erstellt, aber wirklich schlau werde ich daraus eben nich. Im Grunde weiss ich ja, wo es klemmt?

So wird das nichts. Die eingesetzten Werkzeuge sollte man schon wenigstens ansatzweise beherrschen.

WHEN, CASE und Stringoperationen sind eben teuer.
Bitte warten ..
Mitglied: c0nsp1r4cy
21.10.2020, aktualisiert um 12:32 Uhr
Geb ich Dir grundsätzlich Recht, aber gemäß Analyse sind das die verschmerzbaren Parts der Query.

Zitat von mbehrens:
Ich habe keine Ahnung von den Analysetools oder wie sie zu benutzen sind.

Den ExecutionPlan habe ich mal erstellt, aber wirklich schlau werde ich daraus eben nich. Im Grunde weiss ich ja, wo es klemmt?

So wird das nichts. Die eingesetzten Werkzeuge sollte man schon wenigstens ansatzweise beherrschen.

Es spielt wohl keine Rolle, wie ich zum Ziel komme, denn das Hauptproblem wurde identifiziert. Somit geht es nicht mehr um die Analyse, sondern einen Lösungsvorschlag.

Aber danke fürs Gespräch.
Bitte warten ..
Mitglied: GrueneSosseMitSpeck
21.10.2020, aktualisiert um 23:02 Uhr
also zuallererst... guck mal wo die TempDB ist. Die sollte auf dem schnellsten verfügbaren Speicher liegen, NVME ist da eigentlich Pflicht oder zumindestens SSD bevor man irgendwas anders betrachtet.

Dann - da sind unendlich viele Stringoperationen drin. Sowas kostet Zeit, da sind Datumskonvertinerungen vorhanden, obwohl der SQL Server eigentlich einen eigenen Datetime Datentyp hat. Wer den nicht verwendet, den bestraft die Konvertierungsperformance... aber oft ist man ja nicht Herr des Schemans sondern muß nur irgendwas draus machen was irgendwie krank aussieht und SAP ist sogar hammerkrank. Ich möcht schreiend weglaufen wenn ich diese drei Buchstaben in der Reihenfolge höhre

Und mal ehrlich 11 Sekunden für so eine Query mit 80.000 Datensätzen Resultset, damit würde ich mich zufriedengeben. Auch eine Minut wär noch ok. Ich hab ähnliche Abfragen aus Sage Officeline Datenbanken gemacht, die liefen damals (1999-2002, SQL Server 6.5 auf Dual Pentium 3, 256 MB RAM) 2-4 Stunden. Einen richtigen Performanceschub auf 30 Minuten gabs erst nachdem wir auf eine 8-CPU-Maschine mit 3 GB Speicher aufgerüstet hatte. Ich weiß, 3 GB... 8 CPUs... aber in jenen Zeiten war Datensparsamkeit den schwächlichen Datenbankservern der damaligen Zeit geschuldet, nicht gesetzlichen Vorgaben.

Was vielleicht was bringt ist mal auf einen aktuellen SQL SErver zu aktualisieren, falls irgendwie machbar. Der 2008 ist schon lang "end of life", da kann man der Geschäftsführung ohnehin damit argumentieren daß die Version voller Bugs ist (Joins werden oft nicht richtig optimiert) die Microsoft nie mehr fixen wird... ab SQL 2014 gibts den Query store, davor muß man mit dem Abfrageoptimierer vorlieb nehmen. Gehört zum SQL Trace dazu, das sind Tools die man unbedingt installieren sollte und die man verstehen lernen sollte. Denn so manch Abfrage performt schlecht weil es keine unterstütztenden Indizes dazu gibt.

Letztenendlich muß man die Abfrage so passend machen daß der SQL Server sie korrekt optimiert und nicht so daß der SQL Code "schön" aussieht. Ach noch was... wenn der Server in einer VM ist. Wir hatten das neulich daß ein SQL Server schlecht performte... weil 10 Cores einem Socket im ESX zugewiesen waren. Mit 1 core pro Socket stieg die Abfrageleistung um satte 20%, dann machts Sinn am MaxDOP und CTP herumzuschrauben. Steht beides standardmäßig auf unlimited, aber bei komplexen Abfragen ist das oft kontraproduktiv.

Cost Threshold for parallelism sollte auf Werte zwischen 50 und 150 eingestellt sein und "max degree of parallelism" sollte nicht höher sein als die Anzahl an phyischen Cores. Auch das tunt Abfragen ein wenig. Das sind Optionen in der SQL Server Instanz (rechte Maustaste im Management Studio auf den serverknoten ganz links oben, Eigenschaften, Optionen)
Bitte warten ..
Mitglied: c0nsp1r4cy
22.10.2020 um 07:46 Uhr
Ahoi GrueneSoße,

ein großes Dank für diese ausführlichen Gedanken!

Da ist nun einiges dabei, was ich konkreter untersuchen werde.

Jaaaaa der 2008er Server :/ - klar der sollte mal aktualisiert werden und ist auch geplant.

Ursprünglich war meine Hoffnung allerdings, es gebe eine entscheidende Idee um die With-Tabelle zu ersetzen oder umzubauen.

Diese Tabelle braucht 1-2s, wenn ich sie alleine ausführe und ich verstehe nicht wieso, sobald ich die Tabelle joine, dann plötzlich um die 11s brauche für alle Datensätze.

Gruß
Bitte warten ..
Heiß diskutierte Inhalte
Hardware
Schwarmwissen gefragt: Rätselstunde am Samstag Abend - LWL Verkabelung
gelöst Xaero1982FrageHardware31 Kommentare

Nabend Zusammen, heute Abend gibt es ein kleines Rätsel für euch was es zu lösen gilt. Die Lösung werde ...

Netzwerke
Aufbau Praxisnetzwerk mit Fragen (TI, Switch, Firewall, VoIP, Netzwerkdesign)
razorrFrageNetzwerke21 Kommentare

Hallo, ich bin neu hier, aber habe hier schon sehr lange im Forum mitgelesen bzw. mich schlau gemacht und ...

Vmware
ESXi für Raspberry Pi
sabinesInformationVmware17 Kommentare

VMware hat den ESXi für den Raspberry Pi (zu Testzwecken) vorgestellt, läuft 180 Tage auf dem Pi 4 mit ...

Backup
Veeam Backup-Server aus der Domäne nehmen
redhorseFrageBackup15 Kommentare

Guten Morgen, da in unserer Backupumgebung ein Hardwaretausch ansteht, konzipiere ich gerade Möglichkeiten die Sicherheit zu erhöhen. Konkret geht ...

Microsoft Office
Office 2016 auf Server 2019
gelöst EmptymanFrageMicrosoft Office11 Kommentare

Hallo zusammen, ich bin gerade dabei für mein Unternehmen eine neue Terminalserver-Umgebung auf Basis Server 2019 zu bauen. Im ...

Windows Server
Server mit AMD EPYC 7F52 (1Socket) wird als 2 Socket Server angezeigt
LordXearoFrageWindows Server11 Kommentare

Hallo Zusammen, ich komme mit meinem Problem nicht so recht weiter und hoffe aufjemanden der noch weitere Ideen hat. ...

Ähnliche Inhalte
Datenbanken

MS SQL Server - SQL Query zum vereinigen von Datensätzen

gelöst 123-PaterFrageDatenbanken7 Kommentare

Kleine Knobelaufgabe: Ich möchte im M$ SQL Server eine View erzeugen, die mir aus zwei Ergebnisdatensätzen einen Datensatz erzeugt. ...

Datenbanken

SQL-Query - Like Operator - Usereingabe

gelöst SchelinhoFrageDatenbanken4 Kommentare

Hallo! Ich habe ein SQL-Script, welches als solches auf der Datenbank im SQL-Developer funktioniert. Mir geht es um eine ...

Batch & Shell

Bash: SQL Query (Wenn count 1 dann .)

gelöst nepixlFrageBatch & Shell8 Kommentare

Hallo Gentlemen, derzeit verzweifel ich etwas an einem simplen Bashscript. Scheinbar kann ichs der Bash-Zicke nicht richtig servieren, auch ...

Windows Tools

MS SQL Instanz

sebastian2608FrageWindows Tools6 Kommentare

N´ Abend Leute, heute habe ich einen besonders seltsamen Fall für euch ;) Folgende Grundsituation: Ein Bekannter hatte bis ...

Datenbanken

MS SQL - Query Ergebnis (eine Zeile) aufgeteilt in zwei Zeilen (je relevante Spalte)

gelöst c0nsp1r4cyFrageDatenbanken3 Kommentare

Guten Tag allerseits, ich stehe ein kleinwenig auf dem Schlauch. Anforderung: Im Dokument gibt (kopfseitig) Rabatt- / und/oder Frachtkosten. ...

Windows Update

MS SQL Server Updates

sabinesInformationWindows Update

Für 2012, 2014 und 2016 sind seit Dienstag wichtige Sicherheitsupdates verfügar, die eine remote, leicht auszunutzende Lücke im Reporting ...

Neue Fragen
Administrator Magazin
11 | 2020 Virtualisierung ist aus der IT nicht mehr wegzudenken. In der November-Ausgabe des IT-Administrator Magazins dreht sich der Schwerpunkt um das Thema "Server- und Storage-Virtualisierung". Darin erfahren Sie, wie sich die Virtualisierungstechnologie entwickelt hat, welche Varianten es im Bereich Server und Speicher gibt und wie ...
Neue Beiträge
Neue Jobangebote
Server- und Storage-VirtualisierungServer- und Storage-VirtualisierungBerechtigungs- und IdentitätsmanagementBerechtigungs- und IdentitätsmanagementWebdienste und -serverWebdienste und -serverDatenbankenDatenbankenMonitoring & SupportMonitoring & SupportHybrid CloudHybrid Cloud