Stellen Sie zunächst sicher, dass Sie die Leistung richtig profilieren. Führen Sie die Abfrage beispielsweise zweimal von ADO.NET aus und prüfen Sie, ob das zweite Mal viel schneller ist als das erste Mal. Dadurch entfällt der Overhead des Wartens auf das Kompilieren der App und das Hochfahren der Debugging-Infrastruktur.
Überprüfen Sie als Nächstes die Standardeinstellungen in ADO.NET und SSMS. Wenn Sie beispielsweise SET ARITHABORT OFF in SSMS ausführen, stellen Sie möglicherweise fest, dass es jetzt genauso langsam läuft wie bei Verwendung von ADO.NET.
Was ich einmal gefunden habe, war, dass SET ARITHABORT OFF in SSMS dazu führte, dass die gespeicherte Prozedur neu kompiliert und/oder andere Statistiken verwendet wurden. Und plötzlich meldeten sowohl SSMS als auch ADO.NET ungefähr die gleiche Ausführungszeit.
Um dies zu überprüfen, sehen Sie sich die Ausführungspläne für jeden Lauf an, insbesondere die Tabelle syscacheobjects. Sie werden wahrscheinlich anders sein.
Durch Ausführen von „sp_recompile“ für eine bestimmte gespeicherte Prozedur wird der zugehörige Ausführungsplan aus dem Cache gelöscht, wodurch SQL Server die Möglichkeit erhält, bei der nächsten Ausführung der Prozedur einen möglicherweise geeigneteren Plan zu erstellen.
Schließlich können Sie den „Nuke it from Orbit“-Ansatz ausprobieren, indem Sie den gesamten Prozedur-Cache und die Speicherpuffer mithilfe von SSMS löschen:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Wenn Sie dies tun, bevor Sie Ihre Abfrage testen, wird die Verwendung von zwischengespeicherten Ausführungsplänen und dem Zwischenspeicher für vorherige Ergebnisse verhindert.