Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Parameter-Sniffing (oder Spoofing) in SQL Server

FYI - Sie müssen etwas anderes beachten, wenn Sie mit SQL 2005 und gespeicherten Prozessen mit Parametern arbeiten.

SQL Server kompiliert den Ausführungsplan der gespeicherten Prozedur mit dem ersten verwendeten Parameter. Wenn Sie also Folgendes ausführen:

usp_QueryMyDataByState 'Rhode Island'

Der Ausführungsplan funktioniert am besten mit den Daten eines kleinen Staates. Aber wenn sich jemand umdreht und wegrennt:

usp_QueryMyDataByState 'Texas'

Der Ausführungsplan, der für Daten in der Größe von Rhode Island entwickelt wurde, ist bei Daten in der Größe von Texas möglicherweise nicht so effizient. Dies kann beim Neustart des Servers zu überraschenden Ergebnissen führen, da der neu generierte Ausführungsplan auf den zuerst verwendeten Parameter abzielt - nicht unbedingt auf den besten. Der Plan wird nicht neu kompiliert, bis es einen wichtigen Grund dafür gibt, z. B. wenn Statistiken neu erstellt werden.

Hier kommen Abfragepläne ins Spiel, und SQL Server 2008 bietet viele neue Funktionen, die DBAs dabei helfen, einen bestimmten Abfrageplan langfristig zu fixieren, unabhängig davon, welche Parameter zuerst aufgerufen werden.

Meine Sorge ist, dass Sie beim Neuaufbau Ihrer gespeicherten Prozedur die Neukompilierung des Ausführungsplans erzwungen haben. Sie haben es mit Ihrem Lieblingsparameter aufgerufen, und dann war es natürlich schnell - aber das Problem war möglicherweise nicht die gespeicherte Prozedur. Möglicherweise wurde die gespeicherte Prozedur irgendwann mit einem ungewöhnlichen Satz von Parametern und damit einem ineffizienten Abfrageplan neu kompiliert. Möglicherweise haben Sie nichts behoben, und beim nächsten Neustart des Servers oder beim erneuten Kompilieren des Abfrageplans kann dasselbe Problem auftreten.