Bonjour,
J'ai un petit souci de temps de réponse avec une vue utilisant une CTE, je m'explique.
Ci-joint ma vue:
Quand je tape la requête suivante dans le Management Studio, le temps de réponse est inférieur à 1s
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select IdClient, IdTechCleUn, IdTechCleParent from ViewXXX as x where x.IdClient = 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Partager