2

J'ai cretaed un TVF qui renvoie une table avec des enregistrements parents à partir d'un CTE récursif here. Cela fonctionne très bien et le résultat est disponible directement. Maintenant, je voulais obtenir les enregistrements enfants (ils ont le même FK que le PK de l'enregistrement en cours). Le problème est qu'il faut 1:10 minutes pour obtenir 22 dossiers enfants pour un identifiant donné. Pourquoi est-ce si lent par rapport à l'inverse TVF qui cherche des enregistrements parent?Extrêmement lent Table-Valued-Fonction avec CTE récursif à l'intérieur

C'est le ITVF:

CREATE FUNCTION [dbo].[_nextClaimsByIdData] (
    @idData INT 
) 

RETURNS TABLE AS 
RETURN(
    WITH NextClaims 
    AS(
     SELECT 1 AS relationLevel, child.* 
     FROM tabData child 
     WHERE child.fiData = @idData 

     UNION ALL 

     SELECT relationLevel+1, parent.* 
     FROM NextClaims nextOne 
     INNER JOIN tabData parent ON parent.fiData = nextOne.idData 
    ) 

    SELECT TOP 100 PERCENT * FROM NextClaims order by relationLevel 
) 

Ceci est la relation:

Datamodel

Et ce qui suit le (correct) résultat pour une requête exemplaire:

select relationLevel,idData,fiData from dbo._nextClaimsByIdData(30755592); 

rl idData  fiData 
1 30073279 30755592 
2 30765260 30073279 
3 31942491 30765260 
4 30895945 31942491 
5 48045119 30895945 
6 48342321 48045119 
7 48342320 48342321 
8 48308966 48342320 
9 48308965 48308966 
10 47044261 48308965 
11 47044260 47044261 
12 47253273 47044260 
13 47253272 47253273 
14 47279292 47253272 
15 47279293 47279292 
15 47494589 47279292 
16 47494588 47494589 
17 46051999 47494588 
18 46373053 46051999 
19 46083426 46373053 
20 46099567 46083426 
21 46600314 46099567 
22 46595167 46600314 

Il est possible que la cause de l'performac e perdu est que dans mon premier TVF (lié ci-dessus) je cherche des clés primaires et dans ce TVF je suis à la recherche de clés étrangères (auto-référencement)? Si oui, comment puis-je optimiser mon schéma de table pour accélérer la requête?


MISE À JOUR: J'ai découvert que la cause de ce problème de performance était qu'il n'y avait pas d'index fiData (la foreignkey-colonne de clé primaire de la table). Après la création et la réorganisation, le résultat est arrivé immédiatement.

Merci.

+0

Je ne sais pas pourquoi il serait plus lent 'SELECT TOP 100 POUR CENT * de l'ordre NextClaims par relationLevel' est certainement malodorantes si et devrait être remplacé par' SELECT * FROM NextClaims'. Si vous voulez ORDER cela doit être fait par le code appelant. À quoi ressemblent les plans d'exécution? –

+0

Je veux encapsuler l'ordre (et donc la complexité) dans cette fonction, de sorte qu'aucun appelant n'a besoin de connaître l'ordre interne. Mais en outre, cela ne peut pas être le rythme de la performance perdue. Je vais y jeter un coup d'oeil lundi;) –

+0

@Tim - La raison pour laquelle il est malodorant, c'est que ça ne marchera pas. Il sera optimisé. Pour voir ceci essayez de le changer en 'order par relationLevel DESC' –

Répondre

0

Comme indiqué Index sur les colonnes fiData résolu problème de performance

Questions connexes