[SQL2005] [TSQL]Problème d'une CTE dans une vue
Bonjour,
J'ai un petit souci de temps de réponse avec une vue utilisant une CTE, je m'explique.
Ci-joint ma vue:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| create view ViewXXX
as
with TableHierarchyCTE (IdTechCleUn, IdTechCleParent, IdClient)
as
(
-- Anchor member definition
select IdTechCleUn, IdTechCleParent, IdClient
from TableA
union all
select IdTechCleX, IdTechCleUn, IdClient
from Counterparty
union all
-- Recursive member definition
select rg.IdTechCleUn, rg.IdTechCleParent, rghcte.IdClient
from TableA rg
inner join TableHierarchyCTE rghcte on rghcte.IdTechCleParent=rg.IdTechCleUn
)
select distinct IdTechCleUn, IdTechCleParent, IdClient
from TableHierarchyCTE
where IdTechCleParent is null
|
Quand je tape la requête suivante dans le Management Studio, le temps de réponse est inférieur à 1s
Code:
1 2 3
| select IdClient, IdTechCleUn, IdTechCleParent
from ViewXXX as x
where x.IdClient = 521
|
Quand j'exécute la même mais à l'aide de sp_executeSql avec un paramètre, le temps de réponse est passé au dela des 5s.
Code:
1 2 3
|
exec sp_executesql N'select IdTechCleUn, IdTechCleParent, IdClient
from ViewXXX as x where x.IdClient = @param_0_CurrentClientId ',N'@param_0_CurrentClientId int',@param_0_CurrentClientId=521 |
Après analyse sur les plans d'exécution, il s'avère que les deux requêtes n'utilisent pas le même plan d'exécution.
L'une (la première) utilise le filtre sur le client et l'affecte sur la première requête de la CTE en utilisant un index Seek.
La deuxième un peu brutal fait un index Scan sur toutes les tables et filtres le résultats final avec le code Client.
Pourquoi les plans diffères?
Est ce que quelqu'un a déjà été confronté à ce problème?
Y a t'il un moyen de forcer ce filtre?
Merci de votre aide
NB: Les contraintes m'imposent d'utiliser une vue et non pas une procédure stockée.