Für jede Einfügeanweisung sehe ich sp_executesql in SQL Server Profiler


4

Während ich an der Optimierung unserer Datenbank und den Abfragen für eines unserer Produkte arbeitete, entschloss ich mich, Profiler in der QA-Umgebung zu öffnen und zu sehen, was es anzeigt.

Ich habe für jedes Insert, das ich aufgerufen habe, einen Aufruf von sp_executesql mit dem Text der insert-Anweisung erhalten.

Dies scheint ein großer Erfolg zu sein. Gibt es eine Möglichkeit, dies auszuschalten?

Umgebung:

  • SQL Server 2008 R2 Standard
  • Windows Server 2008 R2 Enterprise
  • 32 GB RAM
  • 2x4 Xeon
9

Ich würde mir nicht zu viele Sorgen machen.

Die Idee ist, Anweisungen für die Wiederverwendung zu parametrisieren.Vermeiden Sie also das Kompilieren

Angenommen, Sie haben drei verschiedene Clients, die drei separate Anweisungen ausführen:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

Jeder dieser hat einen anderen Text, daher wird er zu einem anderen Plan zusammengestellt.Das heißt, 3 Kompilierungen und 3 Pläne werden zwischengespeichert.

Nun, diese 3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42'

Der wiederverwendbare Plan hier gilt für die Anweisung SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 sodass Sie einen Plan haben, der Cache ist.

In ausgelasteten Systemen ist diese Kompilierungszeit von Bedeutung.Und die meisten Abfragen sind komplexer als dies natürlich: Sie können dies häufig für den ersten Lauf im Testing Query Speed nachfolgenden Laufzeiten sehen (siehe Testing Query Speed).

Auch in komplexen und ausgelasteten Systemen kann die geplante Cachegröße begrenzt sein oder dem Datencache (Pufferpool) RAM entziehen, was ebenfalls hinderlich sein kann.Das Extrem könnten 10000 Pläne oder ein Plan für eine vielbeschäftigte Web-App sein.(Der Effekt hängt von den 32- und 64-Bit-Feinheiten ab.)

Bei einigen ORMs und Treibern können Sie dies ausschalten, normalerweise "vorbereitete Anweisungen" oder eine Option: Seien Sie jedoch gewarnt, dies kann die Dinge verlangsamen.Sie sagten, "das scheint ein großer Hit zu sein", was impliziert, dass Sie sich Sorgen über die Last machen ...

+2

Gute Erklärung, warum manche Systeme dies tun.Damit können sie ihre SQL ohne Verwendung gespeicherter Prozeduren parametrisieren. 15 sep. 112011-09-15 19:06:11


4

Ich bin mir nicht sicher, ob ich das verstehe. Möchten Sie die Verwendung von sp_executesql beenden?Wenn ja, müssen Sie einfach Ihren Code ändern, um diese Methode nicht zu verwenden.Ich glaube, dass das SQLCommand-Objekt in .NET sp_executsql verwendet. Wenn Sie also .NET verwenden, sollten Sie diesen Aufruf erwarten.


5

Wenn Sie die meisten ORMs (Link2SQL, EF usw.) verwenden, wird diese reizende kleine Methode verwendet.Wenn Sie eine parametrisierte insert-Anweisung schreiben, wird sie auch in dieser Methode verarbeitet.

  0

Also kann ich mit parametrisierten Einsätzen nicht umgehen?Wie ... überhaupt? 15 sep. 112011-09-15 13:05:38

  0

Nee.Sie können nur Ihre eigene gespeicherte Prozedur verwenden. 15 sep. 112011-09-15 17:19:53