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

Der Parameter funktioniert nicht so gut wie die Festcodierung des Werts

ZUSAMMENFASSUNG BEARBEITEN Auf Anfrage von Damien_The_Unbeliever

Das Ziel besteht darin, die besten/meisten Informationen über den Variablenwert in SQL abzurufen, BEVOR der Plan erstellt wird. Im Allgemeinen wird dies durch Parameter-Sniffing ausgeführt. Es kann einen Grund dafür geben, dass das Parameter-Sniffing in diesem Fall "deaktiviert" wurde. Ohne eine bessere Darstellung des tatsächlichen Codes zu sehen, können wir nicht wirklich sagen, was die Lösung ist oder warum das Problem besteht. Probieren Sie die folgenden Dinge aus, um die betroffenen Bereiche zu zwingen, Pläne mit tatsächlichen Werten zu erstellen.

*LANGE VERSION MIT MEHR DETAILS *

Ist dies Ihre eigentliche gespeicherte Prozedur? Haben Sie Standardwerte für Ihre Parameter? Wenn ja, welche sind das?

Parameter-Sniffing kann helfen - aber es muss typische Parameterwerte haben, um den Plan gut zu erstellen, und wenn nicht, hilft es nicht wirklich oder erstellt einen schlechten Plan, der auf dem nicht typischen Parameterwert basiert. Wenn also eine Variable beim ersten Ausführen und Kompilieren des Plans einen Standardwert von null oder einen Wert hat, der kein typischer Wert ist, wird ein schlechter Plan erstellt.

Wenn jemand anderes diesen Sproc geschrieben hat, hat er möglicherweise aus einem bestimmten Grund das Parameter-Sniffing mit den lokalen Variablen absichtlich "deaktiviert". Geschäftsregeln können diese variablen Strukturen erfordern.

Das Ziel besteht darin, die besten/meisten Informationen über den Variablenwert in SQL abzurufen, BEVOR der Plan erstellt wird, und im Allgemeinen wird dies durch Parameter Sniffing durchgeführt. Aber es gibt Dinge, die dazu führen können, dass es die Leistung negativ beeinflusst, und das kann der Grund sein, warum es „deaktiviert“ ist. Es scheint immer noch so, als ob der Plan mit atypischen Werten für die Parameter oder noch nicht genügend Informationen erstellt wird - ob Parameter-Sniffing verwendet wird oder nicht.

Versuchen Sie, die Abfrage innerhalb des Sproc mit Use sp_executesql aufzurufen, um die betroffenen Abfragen auszuführen, und zwingen Sie sie, einen Plan für diesen Bereich mit den tatsächlichen Variablen zu generieren, und sehen Sie, ob es besser ist. Dies kann Ihre Lösung sein, wenn Sie diese Art von unregelmäßigem Parameterwert haben müssen - erstellen Sie gespeicherte Prozesse, die die betroffenen Teile ausführen, und rufen Sie sie später aus der gespeicherten Prozedur heraus auf - nachdem die Variable einen typischen Wert erhalten hat.

Ohne eine bessere Darstellung des tatsächlichen Codes zu sehen, ist das Problem schwer zu erkennen. Hoffentlich helfen diese Informationen -