Come vengono aggiornati gli indici in cluster quando l'isolamento dell'istantanea è acceso in SQL Server?

StackOverflow https://stackoverflow.com//questions/10670951

Domanda

Ho un database SQL Server 2008 con SET ALLOW_SNAPSHOT_ISOLATION ON e una tabella persona con ID colonne (tasto primario) e SSN (indice unico non cluster).

Una delle righe nel database è ID= 1, SSN= 776-56-4453.

una sola connessione, questo accade:

set transaction isolation level snapshot
begin transaction snapshot
while (1 = 1) select * from person where SSN = '777-77-7777'
.

Quindi su un'altra connessione:

update person set SSN = '555-55-5555' where ID = 1
.

Come previsto, la prima connessione continua a mostrare SSN come '777-77-7777' anche dopo che la seconda connessione termina l'esecuzione. Il piano di esecuzione per la prima connessione mostra un "Seek Index Cluster" su SSN, ma come può la prima connessione continuare a utilizzare l'indice, se il tasto INDICE è stato aggiornato sull'altra connessione?

SQL Server fa qualcosa di speciale per mantenere più versioni degli indici da ospitare per questo?

Sto cercando di capire le caratteristiche di prestazione del livello di isolamento dell'istantanea e quindi vuoi confermare che SQL Server è abbastanza intelligente da utilizzare gli indici esistenti anche quando si recuperano i dati previdenziali dalle versioni precedenti della riga.

È stato utile?

Soluzione

Per quanto posso dire (usare DBCC IND e DBCC PAGE Come descritto qui e guardando sys.dm_tran_version_store) Quando si aggiorna il tasto Indice in un database con Isolamento Snapshot abilitato Quanto segue.

    .
  1. La riga originale viene copiata nell'archivio versione.
  2. La riga originale è contrassegnata come Ghost e ottiene il puntatore della versione aggiornato per puntare alla posizione corretta.
  3. Una nuova riga è inserita per il nuovo valore chiave.
  4. A alcuni punti successivi il processo di pulizia del fantasma viene eseguito e rimuove la riga.

    L'unica differenza nel tuo scenario sembra essere che il processo di pulizia del fantasma non pulisce la riga finché non è più richiesta da una transazione di isolamento istantanea eccezionale. I.e. Il BTree contiene righe per i valori vecchi che nuovi e non sono più necessari che non sono più necessari il quale consente a un indice che cerca il vecchio valore di funzionare ancora come prima.

Altri suggerimenti

Con Isolamento Snapshot, SQL Server inserire "istantanee" dei dati modificati in tempdb e altre connessioni leggeranno da lì.Quindi la tua prima connessione qui sta leggendo i suoi valori e tutti gli indici pertinenti coinvolti da una copia istantanea in tempdb

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top