3

Je viens d'encapsuler une instruction SQL complexe dans une fonction table sur SQLServer 2000. Lorsque vous consultez le plan de requête pour un SELECT * FROM dbo.NewFunc, il me donne juste une analyse de la table que j'ai créée.Table Valued Fonction Où est passé mon plan de requête?

Je devine que c'est parce que la table est créée dans tempdb et je choisis juste de lui.

Ainsi, la requête est tout simplement:

SELECT * FROM table in tempdb 

Mes questions sont les suivantes:

Est-ce l'UDF en utilisant le même plan que l'instruction SQL complexe?

Comment puis-je régler les index pour cette fonction personnalisée? Puis-je voir le vrai plan?

+0

Vous pouvez afficher le plan de requête en exécutant la fonction au moins une fois, puis en recherchant dans le cache, par exemple: https://dba.stackexchange.com/a/198524/18190 – binki

Répondre

6

Les fonctions de table valorisées multi-instructions (TVF) sont des boîtes noires de l'optimiseur pour la requête externe. Vous ne pouvez voir que les E/S, les CPU, etc. à partir du profileur.

Le TVF doit être exécuté et renvoyer toutes les lignes avant tout traitement. Cela signifie qu'une clause where ne sera pas optimisée par exemple. Par conséquent, si ce TVF renvoie un million de lignes, il doit d'abord être trié.

SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC 

Les instructions TVF mono-instruction/inline ne souffrent pas car elles sont développées comme des macros et évaluées. L'exemple ci-dessus évaluerait index etc.

également ici aussi: Does query plan optimizer works well with joined/filtered table-valued functions? et Relative Efficiency of JOIN vs APPLY in Microsoft SQL Server 2008

Pour répondre exactement: non, non et non

J'ai très peu de résultats multiples TVFs: où je fais, je avoir beaucoup de paramètres à filtrer à l'intérieur de l'UDF.