2012-03-15 11 views
6

Stiamo cercando di ottimizzare alcuni dei nostri T-SQL stored procedure per ridurre la contesa tempdb, ma io non riesco a capire come le variabili non-tavolo sono archiviati da SQL Server:Quando una variabile viene dichiarata in una stored procedure T-SQL, viene mantenuta in memoria o tempdb?

  • Quali sui tipi di dati semplici come INT e DATETIME? Sembra che vivrebbero nella memoria.
  • Che dire di VARCHAR/VARCHAR (MAX)? Un normale VARCHAR potrebbe vivere in memoria, ma un VARCHAR (MAX) potrebbe aver bisogno di usare tempdb per la sua archiviazione.
  • Le variabili di tabella sono memorizzate in tempdb. Questi non sono davvero interessato però.

Il MSDN article on tempdb non spiega le variabili regolari.

risposta

8

The Capacity Planning article for tempdb risponde alle vostre domande:

I tipi di dati LOB sono varchar (max), nvarchar (max), varbinary (max) di testo, ntext, immagine e xml. Questi tipi possono avere dimensioni massime di 2 GB e possono essere utilizzati come variabili o parametri nelle stored procedure , funzioni definite dall'utente, batch o query. I parametri e le variabili definite come tipo di dati LOB utilizzano la memoria principale come memoria se i valori sono piccoli. Tuttavia, i valori grandi vengono memorizzati in tempdb. Quando le variabili ei parametri LOB sono archiviati in tempdb, vengono considerati come oggetti interni . È possibile eseguire una query sulla vista di gestione dinamica sys.dm_db_session_space_usage per segnalare le pagine allocate agli oggetti interni per una determinata sessione.

L'articolo vale la pena leggerlo nella sua interezza, perché copre anche molti altri usi di tempdb.

EDIT: Se siete curiosi la quantità di memoria in tempdb una sessione specifica viene utilizzata, è possibile eseguire la seguente query:

select * 
from sys.dm_db_session_space_usage 
where session_id = @@SPID 

Usando questo, non sembrava è stato memorizzato mia variabile VARCHAR(MAX) in tempdb fino a raggiungere circa 1000 KB di dimensioni ... ma sono sicuro che varia in base alla memoria disponibile sul server.

+0

Grazie per aver trovato questo! Suppongo che "se i valori sono piccoli" significa meno di 8000 byte? Indipendentemente da ciò, l'articolo sembra implicare che VARCHAR non MAX (N) e piccole variabili siano archiviati in memoria. –

Problemi correlati