Warum sendet LINQ sp_executesql, anstatt SQL direkt auszuführen?

7

Für LINX to SQL sendet LINQ to SQL Folgendes:

%Vor%

Warum verwendet es sp_executesql?

    
usr 01.07.2009, 13:49
quelle

6 Antworten

11

Diese Notation erlaubt es, die Laufzeit-kompilierte TSQL-Anweisung mit anderen Parametern wiederzuverwenden; d. h. die Anweisung wird nur einmal kompiliert, was die Effizienz verbessert.

    
Adamski 01.07.2009, 14:01
quelle
4

Dies ist zumindest teilweise so, dass Sie die Wiederverwendung des Abfrageplans erhalten. Es könnte die Parameter inline setzen, was bedeutet, dass jedes Mal, wenn Sie die Abfrage mit verschiedenen Parametern ausführen, der Analyzer sie als eine andere Abfrage ansieht und diese erneut analysiert. Aber da es auf diese Art und Weise ausgeführt wird, wird der Abfrageplan zwischengespeichert und kann die neuen Variablen bei jeder Ausführung einfach einbinden.

    
Clyde 01.07.2009 14:03
quelle
4

BEARBEITEN, oops, habe ich statt Parameterersetzung Parameterisierung gesagt, danke stephbu

sp_executesql wird gegenüber execute bevorzugt, da es die Parameterersetzung unterstützt und tendenziell effizienter arbeitet.

    
cmsjr 01.07.2009 14:01
quelle
2

Ich denke nicht, dass es eine Performance-Lösung ist. Ausführungspläne in SQL werden sogar für direkte Abfragen zwischengespeichert.

Ich denke, es ist eine Sicherheitslösung für SQL-Injektion.

Wenn Sie jedoch versuchen, Traces zu verwenden, die Linq to SQL im Datenbankmodul-Optimierungsratgeber verwenden, wird der sp_execute nicht vom Optimierungsratgeber eingebunden, ich möchte ihn deaktivieren. SQL-Injection kann auch in den Linq To Sql-Anweisungen / dem Framework (dem Code) festgestellt werden. Warum würden Sie sogar versuchen, ungültige Daten an SQL zu senden.

    
Gertjan 27.10.2010 13:55
quelle
0

Zu beachten ist, dass es aufgrund der Parametrisierung auch Schutz vor SQL-Injection bietet. Ich kann mich wirklich nicht beschweren ...

    
jinsungy 01.07.2009 14:05
quelle
0

Das ist eine großartige Frage.
Dies ist nicht wirklich eine Antwort, sondern eine Erkundung der Argumentation, die bereits von anderen Antworten gegeben wurde. Fühlen Sie sich frei, diese "Antwort" zu aktualisieren

Die offensichtliche Antwort wäre " parameterized query cache " gewesen. Jedoch konnten Parameter genauso leicht gebunden werden, wenn die Anweisung direkt ausgeführt wurde und werden immer noch zwischengespeichert.

Syntax und Details in diesem MSDN Artikel ...

msdn_microsoft_ms175580

Leistungsansprüche bezweifle ich ohne Daten, da der Cache für direkte und sp_execsql'd-Abfragen identisch zu sein scheint.

Wenn es also nicht diese sind - was ist es?

    
stephbu 08.12.2011 06:41
quelle

Tags und Links