CROIX APPLIQUER avec la fonction table de restriction de la performance

J'ai un problème avec CROSS APPLY avec paramétrés de la fonction table.
Ici est simplifié pseudo-code exemple:

SELECT * 
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) AS lor
CROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvf
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
WHERE ...
  • Sélection interne sur la table LOT_OF_ROWS_TABLE est de retour, le nombre de lignes.
  • La jointure de tables LOT_OF_ROWS_TABLE et ANOTHER_TABLE ne renvoie qu'un seul ou quelques lignes.
  • Fonction à valeur de Table est très coûteuse en temps et lors de l'appel pour un grand nombre de
    les lignes de l'sélectionnez dure très longtemps.

Mon problème:

La fonction est appelée pour toutes les lignes renvoyées par LOT_OF_ROWS_TABLE indépendamment du fait que les données soient limitées lorsque vient se joindre à ANOTHER_TABLE.

L'sélectionnez doit être dans le format, il est généré, et en fait il est beaucoup plus dificile.

Quand j'essaie de le réécrire, il peut être très rapide, mais il ne peut pas être réécrite comme ceci:

SELECT * 
FROM (
    SELECT lor.*
    FROM LOT_OF_ROWS_TABLE lor
    WHERE ...
) AS lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID 
CROSS APPLY dbo.HeavyTableValuedFunction(at.ID) AS htvf
WHERE ...

Je voudrais savoir:

Est-il un réglage ou une astuce ou quelque chose que les forces de sélectionner la fonction d'appel uniquement pour finalement restreint de lignes?

Merci.

EDIT:

La fonction à valeur de table est très complexe: http://pastebin.com/w6azRvxR.
Le select nous parlons est "configuré par l'utilisateur" et généré: http://pastebin.com/bFbanY2n.

Une évidence peut-être: Si seulement vous pouviez changer l'ordre des jointures dans le texte de la requête. Vous pourriez avoir utilisé le FORCE_ORDER indicateur de requête. Comment est le code généré? Il n'y a pas moyen de modifier le comportement sur la fin?
Changer votre dbo.HeavyTableValuedFunction(..) multi-ligne de la table de fonction à une fonction Table en ligne.
trop complexe pour être simplement réécrire une fonction inline
Ah, bien, c'est ce qui est à l'origine de votre problème, donc si vous ne l'affiche pas de nous, il ya peu que nous pouvons faire pour les aider.
La fonction à valeur de table: pastebin.com/w6azRvxR et sélectionnez de nous en parle: pastebin.com/bFbanY2n

OriginalL'auteur Pavel Hodek | 2013-04-26