Ci sono alcune possibili spiegazioni sul motivo per cui vedi questo comportamento. Alcuni comuni sono
- La sottoquery o CTE potrebbe essere ripetutamente rivalutata.
- Materializzare risultati parziali in un
#temp
tabella può forzare un ordine di unione più ottimale per quella parte del piano rimuovendo alcune possibili opzioni dall'equazione. - Materializzare risultati parziali in un
#temp
tabella può migliorare il resto del piano correggendo stime di cardinalità scadenti.
Il metodo più affidabile è semplicemente usare un #temp
tavolo e materializzalo tu stesso.
In caso contrario, per quanto riguarda il punto 1, vedere Fornire un suggerimento per forzare la materializzazione intermedia di CTE o tabelle derivate
. L'uso di TOP(large_number) ... ORDER BY
può spesso incoraggiare lo spooling del risultato piuttosto che la rivalutazione ripetuta.
Anche se funziona comunque non ci sono statistiche sullo spool.
Per i punti 2 e 3 dovresti analizzare il motivo per cui non stavi ottenendo il piano desiderato. Eventualmente riscrivere la query per utilizzare predicati sargable o aggiornare le statistiche potrebbe ottenere un piano migliore. In caso contrario, puoi provare a utilizzare i suggerimenti per le query per ottenere il piano desiderato.