Jump to content

Skalarwertfunktionen im MSSQL performanter einsetzten?


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 musste meine Software von einem Sybase Server auf einen MSSQL Server umstellen. Und jetzt habe ich erschreckend festgestellt, dass der MSSQL Server für die u.g. Abfrage 1,5 Minuten braucht und der Sybase Server hat seine 6 Sekunden dafür benötigt.

 

Der Aufbau des SQL's ist wie folgt:

 

SELECT

funktion1(tabelle1.spalte1),

funktion1(tabelle2.spalte2),

funktion2(tabelle1.spalte3),

funktion2(tabelle2.spalte4),

funktion3(tabelle3.spalte5),

funktion3(tabelle3.spalte6)

FROM

tabelle11

LEFT JOIN tabelle2 ON tabelle1.spalte1 = tabelle2.spalte1

LEFT JOIN tabelle3 ON tabelle2.spalte1 = tabelle3.spalte1

LEFT JOIN tabelle4 ON tabelle3.spalte1 = tabelle4.spalte1

LEFT JOIN tabelle5 ON tabelle4.spalte1 = tabelle5.spalte1

LEFT JOIN tabelle6 ON tabelle5.spalte1 = tabelle6.spalte1

WHERE tabelle6.spalte1 = 'wert'

 

Meine Vermutung ist das der MSSQL Server zuerst alle Datensätze sammelt, anschließend die Funktionen über alle Datensätze jagt und dann erst nach der WHERE Bedingung filtert.

 

Gibt es dort einen Trick oder ein besseres Vorgehen?

 

Vielen Dank im Voraus

 

Mit freundlichen Grüßen

Jorg

Link zu diesem Kommentar

Zuerst würde ich prüfen, ob und welche Indizes auf den Tabellenspalten vergeben sind. Ggf. hier noch mit Indizes nachhelfen.

 

Des Weiteren wäre es interessant zu wissen, welche Funktionen du über die Datensätze "jagst"... Sprich: was sind funktion1, funktion2 und funktion3 konkret?

 

Wieviele Datensätze sind in den jeweiligen Tabellen enthalten?

Sind die Spalten über die du joinst Primärschlüssel oder sind das "normale" Tabellenspalten?

 

Zudem kannst du dir per CTRL+L den Execution Plan deiner Query anzeigen lassen. Dort lässt sich zum einen die "Reihenfolge" der Verarbeitung wie auch die jeweiligen Kosten der Querybestandteile erkennen.

Link zu diesem Kommentar

Vielen Dank für die schnelle Antwort.

 

Hmm also ich habe die Indizes genau so aus der Sybase Datenbank eingesetzt.

Die Joins sind alle über PK erstellt.

Die Funktionen holen aus verschiedenen Tabellen Werte, die anschließend zurück gegeben werden. Aus einer ID wird mit ein paar Parametern ein Text.

 

Nachdem ich mal den Datenbanktraffic auf dem MSSQL Server mitgeschnitten habe, hat man an der Datei gesehen, dass der MSSQL alle Funktionen zu jedem Ergebnis ausgeführt hat und nicht erst nach der Where Klausel.

 

Daher auch meine Frage ob man am SQL Server etwas einstellen kann. Damit er die Funktionen erst nach der Ergebnismenge ausführt.?

 

Vielen Dank

 

Gruß

Jorg

Link zu diesem Kommentar

Moin Moin Nils,

 

Danke für deine Antwort.

 

ich werde es mal mit dem Query Plan versuchen. Aber ich habe das Problem ja schon, mir fehlt ja nur die Lösung :). Es ist Eindeutig, das der MSSQL Server die Funktionen zu dem Ganzen Ergebnis der Joins ausführt. Und anschließend erst nach der WHERE Klausel filtert.

 

Im Sybase ist es so, dass er erst die Joins ohne Funktionen ausführt, dann nach der WHERE Klausel filtert und dann auf das Ergebnis die Funktionen anwendet.

 

Gibt es für das beschriebene Verhalten eine Erklärung oder ist es nun mal so gegeben?

 

Gruß

 

Jorg

Link zu diesem Kommentar
Hmm also ich habe die Indizes genau so aus der Sybase Datenbank eingesetzt.

 

Öhm, mal pauschal gefragt: Was für ein Index liegt den auf den PK-Spalten? Clustered? Non-Clustered?

Was für Indizes hast du sonst noch auf den Tabellen übernommen?

 

Da ich keinerlei Erfahrungen mit Sybase habe, stellt sich mir echt die Frage, was dort für Indizes sinnvoll sind. Das müssten wir ggf. mal gegen die jetzige SQL-DB halten und vergleichen.

Link zu diesem Kommentar

Moin Moin,

 

Danke danke für die Tipps mit den Indizes. Aber genau das habe ich auch am Anfang gedacht. Ich habe diesen Datenbank Mitschnitt in den Optimierungsassistenten geladen und dieser hat mir nur noch zusätzliche Kataloge vorgeschlagen. Nachdem ich dann seinem Rat befolgt habe, waren es anstatt 1:32 nur noch 1:27.

Aber im Sybase dauert die gleiche Query, bei gleichen Datensätzen 6 - 8 Sekunden. Ach es handelt sich um mehr als 50 000 Datensätze in einer Tabelle. Durch die Joins wird die Query so etwas von den 300 000 bis 500 000 Datensätzen haben. Und wenn der MSSQL Server auf die Anzahl der Datensätze die Funktionen ausführt, ist es klar wieso es so lange dauert.

 

:) Es ist leider nicht ganz so einfach das Problem zu beschreiben...

 

Danke für die Antworten nochmals

 

PS: Die Indizes sind alle Clustered...

 

Gruß

Jorg

Link zu diesem Kommentar

Moin,

 

ich bin leider nicht genug Query- und Index-Experte, um mehr dazu sagen zu können. Schätze, da sind wir in diesem Forum etwas überfragt.

 

Gib doch mal auf folgendem Blog eine Kontaktanfrage ein, vielleicht antwortet Steffen ja und hat eine Idee bzw. kann einen Kontakt vermitteln.

Steffen ber SQL, SharePoint und HPC

 

Gruß, Nils

Link zu diesem Kommentar

Leider muss ich mich an der Stelle Nils anschließen. Ohne genau Kenntniss des DB-Schemas, der verwendeten Datentypen und der jeweiligen Indizes sind mir an der Stelle auch ein wenig die Hände gebunden. Des Weiteren fehlt mir die Erfahrung mit Sybase, um das notwendige Hintergrundwissen über Fallstricke bei der Umstellung mitzubringen. Sorry...

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