Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso forzare l'esecuzione di una sottoquery così come una tabella #temp?

Ci sono alcune possibili spiegazioni sul motivo per cui vedi questo comportamento. Alcuni comuni sono

  1. La sottoquery o CTE potrebbe essere ripetutamente rivalutata.
  2. 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.
  3. 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.