Ho un problema con CROSS APPLY
con funzione di tabella parametrizzata. Qui è semplificata esempio di codice pseudo:APPLICAZIONE CROSS con prestazioni limitate della funzione di tabella stimata
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 ...
- interno selezionare sul tavolo
LOT_OF_ROWS_TABLE
sta tornando molte righe. - Unire tabelle
LOT_OF_ROWS_TABLE
eANOTHER_TABLE
restituisce solo una o poche righe. - La funzione con valori di tabella richiede molto tempo e quando si chiama un numero di righe la selezione dura molto a lungo.
Il mio problema:
La funzione viene chiamata per tutte le righe restituite dalla LOT_OF_ROWS_TABLE
a prescindere dal fatto che i dati saranno limitati quando basta aderire ANOTHER_TABLE
.
La selezione deve essere nel formato mostrato - è generata ed in effetti è molto più difficile.
Quando provo a riscriverlo, può essere molto veloce, ma non può essere riscritto così:
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 ...
Mi piacerebbe sapere:
v'è alcuna impostazione o suggerimento o qualcosa che forza selezionare per chiamare la funzione solo per le righe finalmente limitate?
Grazie.
EDIT:
La tabella valutata funzione è molto complessa: http://pastebin.com/w6azRvxR. La selezione di cui stiamo parlando è "configurata dall'utente" e generata: http://pastebin.com/bFbanY2n.
Indicare l'ovvio, forse: Se solo si potesse cambiare l'ordine dei join nel testo della query. Quindi avresti potuto utilizzare l'hint di query FORCE_ORDER. Come viene generato il codice? Non c'è modo di cambiare il comportamento a tale scopo? –
Modifica la funzione 'dbo.HeavyTableValuedFunction (..)' con valore di tabella su più righe in una funzione con valori inline. – RBarryYoung
@RBarryYoung: troppo complesso per riscrivere semplicemente su una funzione inline –