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

Warum erzeugt eine parametrisierte Abfrage im Vergleich zu einer nicht parametrisierten Abfrage einen wesentlich langsameren Abfrageplan?

Es scheint, dass der Abfrageplaner eine Entscheidung in der wörtlichen Abfrage getroffen hat, die auf Informationen basiert, die er bereits hat. Es hätte Statistiken, die es basierend auf der Verbreitung von Daten, die in Ihrem spezifischen Literal angegeben sind, effizient abfragen kann.

Die parametrisierte Abfrage hat die Abfrage ausgewählt, von der sie glaubt, dass sie für alle Daten in Ihrer Tabelle am fairsten ist, was Sie an vielen verschachtelten Schleifen bemerken werden (Performance =schlecht).

Vielleicht könnten Sie versuchen, die Datenbankoptimierungstools auf Ihrer Datenbank auszuführen, um zu sehen, ob einige Indizes Ihnen hier helfen könnten?

Versuchen Sie speziell in Ihrer Abfrage Folgendes:

declare @p0 int
set @p0 = 1000
select *
from foo
join bar on bar.x = foo.x
join baz on baz.y = foo.y
where foo.x = @p0
OPTION ( OPTIMIZE FOR (@p0 = 1000))

Aber ich wäre vorsichtig, dies zu tun, ohne sicher zu sein, dass sich die in dieser Abfrage enthaltenen Daten nicht ändern und Ihre Abfrage zu diesem Plan IMMER effizienter ist.