2010-03-15 8 views
7

Quando la misurazione delle prestazioni sulla mia domanda mi si avvicinò con una dipendenza tra livello di isolamento e il tempo trascorso che è stato sorprendente per mePerchè migliore livello di isolamento significa prestazioni migliori in SQL Server

READUNCOMMITTED - 409024 
READCOMMITTED - 368021 
REPEATABLEREAD - 358019 
SERIALIZABLE - 348019 

colonna di sinistra è tavolo suggerimento, e la colonna di destra è il tempo trascorso in microsecondi (sys.dm_exec_query_stats.total_elapsed_time). Perché un migliore livello di isolamento offre prestazioni migliori? Questa è una macchina di sviluppo e non si verifica alcuna concorrenza. Mi aspetto che READUNCOMMITTED sia il digiuno a causa di un sovraccarico del blocco.

Update: ho fatto misurare questo con

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

emesse e Profiler lo conferma ci sei la cache non colpisce accadendo.

+0

Sicuramente ho una tale abitudine, grazie per il promemoria. Remus ha fornito un input piuttosto valido anche se spero ancora di ottenere una comprensione del perché il fenomeno che osservo accade. –

risposta

4

Prima di tutto, è necessario eseguire ripetutamente la query sotto ciascun livello di isolamento e mediare il risultato, scartando quello con il tempo massimo. Ciò eliminerà l'impatto di riscaldamento del buffer: si desidera che tutte le esecuzioni siano su una cache calda, non una query riscalda la cache e paga la penalità in confronto.

Successivamente, è necessario assicurarsi di misurare in uno scenario di concorrenza realistico. Se si verificano aggiornamenti/inserimenti/eliminazioni nella vita reale, è necessario aggiungerli al test, poiché avranno un impatto enorme sul numero di sotto vari livelli di isolamento. L'ultima cosa che vuoi è concludere 'le letture serializzabili sono le più veloci, le usiamo ovunque' e poi guardare il sistema che si fonde in produzione perché tutto è serializzato.

Oltre a ciò, l'unico livello di isolamento che è legittimamente più veloce è la lettura sporca, poiché non acquisisce i blocchi. Anche lo snapshot di commit (che non hai misurato) non acquisisce i blocchi, ma influisce negativamente sulle prestazioni a causa del sovraccarico della versione delle righe.

+0

Si prega di trovare gli aggiornamenti alla mia domanda per affrontare alcuni dei punti nella tua risposta. Per "letture sporche" intendi READUNCOMMITTED, giusto? –

+0

1) L'esecuzione della query su una cache fredda non è accurata. Le query di produzione non verranno eseguite su una cache fredda, si ottimizzerà uno scenario irrealistico e non si misura la query, si sta veramente misurando il throughput di lettura del disco. È necessario misurare le prestazioni anche su una cache calda e tenere traccia di entrambi (tempo di esecuzione a freddo, tempi di esecuzione a caldo). 2) le letture sporche sono lette senza risposta. –

+0

Quanto è rilevante la cache per una query di grandi dimensioni (milioni di righe) che in circostanze normali viene eseguita una sola volta per dati particolari? –

0

Ora che capisco meglio i livelli di isolamento, vedo che un migliore livello di isolamento potrebbe consentire alcune ottimizzazioni intelligenti. Ad esempio, una volta che la transazione viene letta, alcuni livelli di isolamento dei dati potrebbero stabilire che è necessario utilizzare tali dati fino alla fine piuttosto che provare a rileggerli dal disco.

Sarei ancora interessato a leggere alcuni approfondimenti su questo.

Problemi correlati