MODIFICARE:
Si prega di vedere i commenti di Martin di seguito:
Il CTE non si materializza come una tabella in memoria. È solo un modo per incapsulare una definizione di query. Nel caso dell'OP sarà integrato e lo stesso che farebbe SELECT Column1, Column2, Column3 FROM SomeTable
. Il più delle volte non si materializzano in anticipo, motivo per cui questo non restituisce righe WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, controlla anche i piani di esecuzione. Anche se a volte è possibile hackerare il piano per ottenere una bobina. C'è un elemento di connessione che richiede un suggerimento per questo. - Martin Smith, 15 febbraio 12 alle 17:08
Risposta originale
CTE
Ulteriori informazioni su MSDN
Un CTE crea la tabella utilizzata in memoria, ma è valida solo per la query specifica che la segue. Quando si utilizza la ricorsione, questa può essere una struttura efficace.
Potresti anche prendere in considerazione l'utilizzo di una variabile di tabella. Viene utilizzato come tabella temporanea e può essere utilizzato più volte senza necessità di essere nuovamente materializzato per ogni join. Inoltre, se è necessario persistere alcuni record ora, aggiungere alcuni altri record dopo la selezione successiva, aggiungere alcuni altri record dopo un'altra operazione, quindi restituire solo quei pochi record, quindi questa può essere una struttura pratica, poiché non non è necessario lasciarlo cadere dopo l'esecuzione. Principalmente solo zucchero sintattico. Tuttavia, se si mantiene basso il conteggio delle righe, non si materializza mai su disco. Vedere Qual è la differenza tra una tabella temporanea e una variabile di tabella in SQL Server? per ulteriori dettagli.
Tabella temporanea
Ulteriori informazioni su MSDN: scorri verso il basso del 40% circa
Una tabella temporanea è letteralmente una tabella creata su disco, solo in un database specifico che tutti sanno che può essere eliminato. È responsabilità di un buon sviluppatore distruggere quei tavoli quando non sono più necessari, ma un DBA può anche cancellarli.
Le tabelle temporanee sono disponibili in due varietà: locale e globale. In termini di MS Sql Server si utilizza una #tableName
designazione per locale e una ##tableName
designazione per globale (si noti l'uso di un singolo o doppio # come caratteristica identificativa).
Si noti che con le tabelle temporanee, al contrario delle variabili di tabella o CTE, è possibile applicare indici e simili, poiché si tratta legittimamente di tabelle nel senso normale della parola.
Generalmente userei le tabelle temporanee per query più lunghe o più grandi, e CTE o variabili di tabella se avessi già un piccolo set di dati e volessi semplicemente scrivere un po 'di codice per qualcosa di piccolo. L'esperienza e i consigli di altri indicano che è necessario utilizzare CTE laddove si riceva un numero limitato di righe. Se hai un numero elevato, probabilmente trarrai vantaggio dalla possibilità di indicizzare nella tabella temporanea.