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
etANOTHER_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.
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
Vous devez vous connecter pour publier un commentaire.
vous pouvez diviser cette requête en 2 parties soit utiliser une variable de table ou table temp
maintenant, faites de beaucoup de temps qui est fonction à valeur de table droit
OriginalL'auteur Sankara
Je crois que c'est ce que vous cherchez.
Plan de Forcer Scénario: Créer un Plan Guide de la Vigueur d'un Plan d'Obtenues à partir d'une Requête Réécrite
Fondamentalement, il décrit la ré-écriture de la requête pour obtenir un plan généré à l'aide de l'ordre correct des jointures. Puis, d'économie et de forcer votre requête existante (qui ne change pas) d'utiliser le plan que vous avez enregistré off.
Le BOL lien que j'ai mis en donne même un exemple précis de la ré-écriture de la requête de mettre le joint dans un ordre différent et à l'aide d'un
FORCE ORDER
soupçon. Ensuite, à l'aide desp_create_plan_guild
de prendre le plan de la ré-écrit de la requête et de l'utiliser sur la requête d'origine.OriginalL'auteur Kenneth Fisher
OUI et NON... c'est dur à interprit ce que vous essayez d'atteindre sans échantillon de données et de résultats, pour comparer les résultats.
Donc je vais répondre à votre question ci-dessus (3 ans plus tard!!) directement, avec une instruction directe:
ie:
Lire cette et cette.
Essentiellement, quelque chose comme ça...
Appliquer votre requête pour extrapoler la date que vous souhaitez une FOIS, et à l'aide de la CTE, appliquez ensuite votre deuxième SQL à l'aide de la CROIX APPLIQUER.
Vous n'avez pas le choix. Vous ne pouvez pas faire ce que vous essayez de le faire en SQL.
OriginalL'auteur Fandango68