| 

.NET C# Java Javascript Exception

5
Hi

Ich habe eine Stored Procedure (SQL Server 2008) geschrieben, deie einen Text innerhalb eines SQl Scripts parst. Bei 40000 Zeilen geht der Server mir aber in die Knie und ich würde gerne wissen woran es liegt. Kann ich mir irgendwo anzeigen lassen, wielange die SP pro Zeile braucht?
News:
25.05.2011
TheJoeIaut 173 1 6
5 Antworten
5
Also du hast keine SP sondern eine Funktion. Da du der Funktion eine ID übergibst und zu dieser ID einen Klartext erwartest, nehme ich an, führt deine Funktion irgend ein ein SELECT aus. Damit ist die Funktion nicht deterministisch. Und nicht deterministische Funktionen kann der SQL Optimierer beim Bestimmen des Ausführungsplanes deiner SELECT-Anweisung nicht berücksichtigen. Das heißt, deine Funktion wird wirklich 40.000 mal separat mit eigenem Optmiererlauf und Ausführungsplan ausgeführt. Und das dauert.
Du kannst dir im SSMS den wirklichen Ausführungsplan deiner Anweisung anzeigen lassen. Ich bin mir aber nicht sicher, wie die deine Funktion dort erscheint.

Eine mögliche Lösung wäre nun aus der nicht deterministischen Funktion eine deterministische zu machen. Sprich du übergibst der Funktion keine ID sondern den Text, der hinter der ID steckt. Die Funktion selber wandeln den Text dann in Klartext um. Das kann, abhängig von der SQL-Server Version auch gern ein Stück .NET-Code übernehmen. Diese Funktion ist dann deterministisch und kann vom SQL Server in den Ausführungsplan deiner äußeren SELECT-Anweisung einbezogen werden.
Möglicherweise erhälst du somit eine etwas bessere Performance.

Zweite Möglichkeit, die ich sehe, besteht darin, den Klartext parallel zum verschlüsselten Text in einer Tabelle abzulegen und den Zugriff auf diese Tabelle ggf. über eine StoredProcedure abzusichern.
25.05.2011
Andreas Richter 1,7k 1 2 8
1
Mir ist da jetzt nicht ganz klar: ist ein TEXT in einem Script 40000 Zeilen lang?

Wenn ja, denke ich, liegt dein Performance Problem in einer wohl nicht ganz bestimmungsmässigen Verwendung des SQL Servers. 40000 Zeilen Text wären wohl in einer kleinen Anwendung schneller durchsucht als auf dem Server. Oder aber die Daten in eine Tabelle speichern und die Tabelle durchsuchen lassen - da könnte der Server wieder seine Stärken ausspielen.
25.05.2011
nabuchodonossor 1,3k 5
1
Nein der Text is max 1000 Zeichen lang. Wenn ich ein FullTableSelect wie
SELECT dbo.getCleanText(dbo.tblAktion.id) AS Text From...
durchführe wird die SP ca 40000 mal ausgeführt.
25.05.2011
TheJoeIaut 173 1 6
0
Ich muss nabuchodonossor zustimmen das dafür eine Anwendung besser geeignet ist.

Zu deiner Frage. Mit dem SQL-Server 2008 kannst du auch Storage Procedures debuggen.
Mit dem "Print"-Commando kannst du dir dann auf der Console die Laufzeiten für jede einzelne Anweisung oder jeden Anweisungsblock ausgeben lassen (so wie früher beim PrintF-Debugging).

Alternativ kannst du dir mal noch die CLR-Storage-Procedures anschauen die diese Aufgabe vielleicht schneller lösen würden (ohne die genau Implementierung zu kennen, kann man hier keine Aussage dazu treffen).

Eventuell hat auch deine Procedure noch Optimierungspotenzial.
25.05.2011
Floyd 14,6k 3 9
0
  • Wie Andreas Richter schon schrieb, solltest du überlegen, statt einer ID den Text als Parameter zu übergeben (falls das einfach möglich ist)

  • Soweit ich weiß, kann man in Functions keine PRINT Statements verwenden. Falls du dennoch die Zeiten messen willst, kannst du die relevanten Daten (timestamp begin + id/text, timestamp end + id/text) in einer Logging-Tabelle speichern.

  • Eine andere Möglichkeit der Zeitmessung ist, den Code der Function in eine Stored Procedure zu kopieren, einen Cursor drumrum, und dann die Zeiten mittels PRINT ausgeben.

  • Ein weiterer Weg wäre eine Table-Valued Function, die die bestehende Function aufruft, und eine Table bestehend aus Startzeit, Endzeit, Function-Ergebnis zurückliefert. Diese wird dann mittels OUTER APPLY angewendet.

  • Einsatz einer PERSISTED COMPUTED Column, die das Ergebnis der Function *einmal* berechnet und in der Tabelle abspeichert.
  • 26.05.2011
    devio 302 3

    Stelle deine Sql-Frage jetzt!