Sono sicuro di presumere che dove ho memorizzato le procedure utilizzando tempdb
per scrivere una tabella temporanea, sarebbe meglio passare queste alle variabili di tabella per ottenere prestazioni migliori?Sta usando le variabili Table più velocemente delle tabelle temporanee
risposta
I tempi sono migliori in termini di prestazioni. Se si utilizza una variabile di tabella e i dati nella variabile diventano troppo grandi, SQL Server converte automaticamente la variabile in una tabella temporanea.
Dipende, come quasi ogni domanda relativa al database, su ciò che si tenta di fare. Quindi è difficile rispondere senza ulteriori informazioni.
Quindi la mia risposta è, provalo e dai un'occhiata al piano di esecuzione. Usa il modo più veloce con i costi più bassi.
Il mio commento in alto ha senso e dovrei passare? –
È difficile dire, cambiare o no. Se si desidera restituire una variabile di tabella e le operazioni sono veloci in entrambi i modi, sì, vorrei passare. Dovresti davvero provarlo. Ad esempio, la scorsa settimana ho ottimizzato una query che diventa così lenta. 20 ore prima, ora 2 minuti. Sono passato da una variabile di tabella a una tabella temporanea. I dati restituiti non erano grandi, solo 2000 righe, ma molte operazioni e filtri. – dknaack
"Se si utilizza una variabile di tabella e i dati nella variabile diventano troppo grandi, SQL Server converte automaticamente la variabile in una tabella temporanea." Questa affermazione è completamente falsa. –
@Table può essere più veloce in quanto v'è meno "tempo di setup", in quanto l'oggetto è in memoria di sola.
@Tavoli hanno un sacco di catture però.
Puoi avere una chiave primaria su un @Table ma questo è tutto. Altri indici Clustered NonClustered per combinazioni di colonne non è possibile.
Anche se la tabella contiene volumi di dati reali (più di 200 o 1000 righe), l'accesso alla tabella sarà più lento. Soprattutto quando probabilmente non avrai un indice utile su di esso.
# Le tabelle sono un problema con proc in quanto devono essere eliminate durante il debug, richiedono più tempo per essere create. e richiedono più tempo per l'installazione in quanto è necessario aggiungere indici come seconda fase. Ma se hai molti dati allora le sue #tables ogni volta.
Anche nei casi in cui sono presenti meno di 100 righe di dati in una tabella, è possibile continuare a utilizzare #Tables poiché è possibile creare un indice utile sulla tabella.
In sintesi io uso @Tables la maggior parte del tempo per la facilità nel fare semplici proc ecc. Ma tutto ciò che deve essere eseguito dovrebbe essere un #Table.
Anch'io credevo in questa favola, fino a quando non sono stato bloccato di recente una query e (una delle ultime cose che ho fatto) la stessa esatta query (testata più volte, usando gli stessi parametri) restituita in 5 secondi usando un '# TempTable' contro 16 secondi usando un '@ TableVar' – Jason
@Le tabelle non hanno statistiche, quindi il piano di esecuzione richiede più congetture. Da qui il limite superiore consigliato di 1000 righe ish. #Le tabelle contengono statistiche ma queste can be cached tra le chiamate. Se le vostre cardinalità si differenziano in modo significativo ogni volta che viene eseguito il SP, vorrete fare lo REBUILD
e RECOMPILE
ogni volta. Questo è un overhead, ovviamente, ma che deve essere bilanciato rispetto al costo di un piano di spazzatura.
Entrambi i tipi eseguiranno IO to TempDB.
Quindi no, le tabelle @ non sono una panacea.
Quanti record saranno presenti nelle tabelle temporanee, qual è la configurazione del server come se le variabili di tabella possano essere inserite nel tempdb. http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx – Kane
I dati variano, ma questo è un buon punto . Se una variabile di tabella sarà più performante con una piccola quantità di dati, allora la cambierò. –
possibile duplicato di [Qual è la differenza tra una tabella temporanea e una variabile di tabella in SQL Server?] (Http://stackoverflow.com/questions/27894/whats-the-difference-obetween-a-temp-table-and-table -variable-in-sql-server) o questo: http: // stackoverflow.it/questions/6991511/sql-server-temp-table-vs-table-variable e probabilmente più – gbn