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

Usando con vs dichiarare una tabella temporanea:performance / differenza?

Il @table la sintassi crea una variabile di tabella (una tabella effettiva in tempdb ) e ne materializza i risultati.

Il WITH la sintassi definisce un Espressione di tabella comune che non è materializzato ed è solo una vista in linea.

La maggior parte delle volte sarebbe meglio usare la seconda opzione. Hai detto che questo è all'interno di una funzione. Se si tratta di un TVF, la maggior parte delle volte si desidera che questi siano inline anziché multi-istruzione in modo che possano essere espansi dall'ottimizzatore:ciò non consentirebbe immediatamente l'uso di variabili di tabella.

A volte, tuttavia, (ad esempio, la query sottostante è costosa e si desidera evitare che venga eseguita più volte) è possibile che la materializzazione dei risultati intermedi migliori le prestazioni in alcuni casi specifici. C'è al momento non c'è modo di forzare questo per i CTE (senza forzare almeno una guida del piano )

In tale eventualità (in generale) hai 3 opzioni. Un @tablevariable , #localtemp tabella e un ##globaltemp tavolo. Tuttavia, solo il primo di questi può essere utilizzato all'interno di una funzione.

Per ulteriori informazioni sulle differenze tra le variabili di tabella e le tabelle #temp vedi qui .