2013-07-12 24 views

risposta

10

Entrambi sono persistenti in Tempdb; tuttavia, i problemi di prestazioni entrano in gioco perché l'ottimizzatore non mantiene statistiche sulle variabili di tabella. Questo è problematico perché l'ottimizzatore deve SEMPRE supporre che ci sia 1 riga nella variabile della tabella. Ovviamente questo può davvero rovinare un piano di query, specialmente quando ci sono molte righe nella variabile della tabella. Non userei una variabile table per memorizzare qualcosa di più di una o due righe; altrimenti, le prestazioni potrebbero essere imprevedibili.

+5

Non ci sono statistiche mantenute per le variabili di tabella ma il conteggio delle righe è. L'ottimizzatore assume generalmente che la cardinalità della variabile di tabella sia 0 righe perché l'istruzione viene compilata prima che la variabile di tabella venga popolata. Se la dichiarazione è soggetta a ricompilazione, può utilizzare il conteggio delle righe effettivo. –

+0

Esempio di questo nella [sezione di cardinalità della mia risposta qui] (http://dba.stackexchange.com/questions/16385/whats-the-difference- between-a-puntable-and-table-variable-in -SQL server/16386 # 16386) –

4

Le tabelle temporanee sono simili alle tabelle ma sono memorizzate in tempdb quando vengono create, il che significa che l'ottimizzatore può creare statistiche su di esse, mentre le tabelle sono simili alle variabili e non ci sono statistiche su di esse.Utilmente quando si confrontano le tabelle tmp vs variabili di tabella, le tabelle temporanee escono in cima. Il motivo è che il Query Optimizer a volte genera cattivi piani per le tabelle vars. Questo può essere visto soprattutto quando ci sono molti dati. Il punto più grande che posso fare è che le variabili di tabella hanno maggiori probabilità di causare piani di esecuzione imprevedibili rispetto ai piani generati per le tabelle temporanee. Le tabelle temporanee d'altra parte, causeranno più ricompilazione.

Problemi correlati