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

Risultati imprevisti da CTE

Non c'è niente di inaspettato in quel risultato, tranne forse se non lo capisci.

Ogni CTE viene risolto each and every time è referenziato. Sì, ecco perché è possibile che un semplice CTE su una tabella altamente transazionale restituisca 4 righe in un riferimento e 5 righe nei 2 livelli successivi.

Sul tuo campione, tuttavia, è a causa di ORDER BY NEWID(), che assegna a ciascuna risoluzione del CTE originale un diverso row_number()-ing. Pensavi che i CTE siano archiviati in memoria e memorizzati nella cache? Sul sito SQLFiddle, sotto i risultati, è presente un collegamento "visualizza piano di esecuzione". Mostra 2 scansioni distinte e separate della tabella .