Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi une requête paramétrée produit-elle un plan de requête beaucoup plus lent qu'une requête non paramétrée ?

Il semble que le planificateur de requête a pris une décision dans la requête littérale qui est basée sur des informations dont il dispose déjà. Il disposerait de statistiques qu'il pourrait interroger efficacement en fonction de la répartition des données fournies dans votre littéral spécifique.

La requête paramétrée a choisi la requête qu'elle juge la plus juste pour toutes les données de votre table, ce qui, vous remarquerez, comporte de nombreuses boucles imbriquées (performance =mauvaise).

Peut-être pourriez-vous essayer d'exécuter les outils d'optimisation de base de données sur votre base de données pour voir si certains index pourraient vous aider ?

Plus précisément dans votre requête, essayez ceci :

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))

Mais je me méfierais de le faire sans être certain que les données contenues dans cette requête ne changeront pas et que votre requête sur ce plan sera TOUJOURS plus efficace.