In che modo SQL Server determina l'ordine in cui accetta i blocchi durante la selezione di una tabella?


10

Ho due stored procedure che si bloccano quando il sistema è sotto carico. Proc A sta selezionando da una tabella mentre Proc B sta inserendo nella stessa tabella. Il grafico di blocco mostra che Proc A ha un blocco di pagina in modalità S per cui Proc B desidera un blocco in modalità IX, Proc A tuttavia è in attesa di un blocco di pagina in modalità S per un'altra pagina in cui Proc B ha già un blocco di pagina in modalità IX .

Chiaramente questo potrebbe essere risolto assicurando che entrambe le query blocchino le pagine nella tabella nello stesso ordine, ma non riesco a capire come farlo.

La mia domanda è: in che modo SQL Server determina in quale ordine bloccare le pagine mentre si eseguono INSERT e SELECT e come è possibile modificare questo comportamento?

Risposte:


2

In che modo SQL Server determina in quale ordine bloccare le pagine mentre si eseguono INSERT e SELECT a

Indeterminato: eseguito dall'elaborazione interna e in base all'output di Query Optimizer.

e come puoi modificare questo comportamento?

Controlla il tuo isolamento. Se leggi per scrivere, indica a SQL Server di ottenere immediatamente un blocco di scrittura. Punto chiuso


1

Attualmente, proc A ha un blocco condiviso.

"Nessun'altra transazione può modificare i dati mentre esistono blocchi condivisi (S) sulla risorsa." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Se utilizzi sql 2005 o versioni successive, prova a utilizzare l'isolamento dello snapshot.

"Il livello di isolamento dello snapshot utilizza il controllo delle versioni delle righe per fornire coerenza nella lettura a livello di transazione. Le operazioni di lettura non acquisiscono blocchi di pagine o di riga; vengono acquisiti solo i blocchi di tabelle SCH-S. Quando leggono le righe modificate da un'altra transazione, recuperano la versione della riga che esisteva all'avvio della transazione. È possibile utilizzare l'isolamento dello snapshot su un database solo quando l'opzione di database ALLOW_SNAPSHOT_ISOLATION è impostata su ON. Per impostazione predefinita, questa opzione è disattivata per i database degli utenti. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Poiché vengono acquisiti solo i blocchi Sch-S, la tua lettura non dovrebbe essere in grado di bloccare la tua scrittura.

"I blocchi di stabilità dello schema (Sch-S) non bloccano alcun blocco transazionale, inclusi i blocchi esclusivi (X)." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Tieni presente che il livello di isolamento dello snapshot fa un uso intensivo di tempdb per il versioning delle righe, quindi ridimensionalo in modo appropriato e rispetta le migliori pratiche per le strategie del disco tempdb.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.