2012-12-19 6 views
11

Attualmente sto avendo problemi con deadlock frequenti con un tavolo specifico utente in SQL Server 2008. Qui ci sono alcuni fatti su questa particolare tabella:Come utilizzare in modo efficiente LOCK_ESCALATION in SQL Server 2008

  1. ha una grande quantità di righe (da 1 a 2 milioni)
  2. Tutti gli indici utilizzati in questo tavolo hanno solo il "utilizzare il blocco della riga" spuntato nelle loro opzioni Edit: C'è solo un indice sulla tabella che è la sua chiave primaria
  3. le righe vengono frequentemente aggiornate da più transazioni ma sono univoche (ad es. probabilmente un migliaio di più istruzioni di aggiornamento vengono eseguite su righe univoche diverse ogni ora)
  4. la tabella non utilizza le partizioni.

Al momento del check tabella a sys.tables, ho trovato che la lock_escalation è impostato su TABLE

Sono molto tentato di trasformare la LOCK_ESCALATION per questa tabella per DISABLE, ma io non sono davvero sicuro di quello che effetto collaterale questo potrebbe incorrere. Da quanto ho capito, utilizzando DISABLE ridurrà al minimo le serrature crescenti da TABLE livello che, se combinata con le impostazioni di blocco fila degli indici teoricamente dovrebbe ridurre al minimo le situazioni di stallo che sto incontrando ..

Da quello che ho letto in Determining threshold for lock escalation sembra che il blocco aumenta automaticamente quando una singola transazione recupera 5000 righe.

Cosa significa una singola transazione in questo senso? Una singola sessione/connessione che riceve 5000 righe attraverso singole istruzioni di aggiornamento/selezione?

Oppure è una singola istruzione di aggiornamento/selezione SQL che recupera 5000 o più righe?

Tutta la comprensione è apprezzato, btw, DBA n00b qui

Grazie

+1

Una singola connessione/transazione, che ** AGGIORNAMENTO ** (o inserti) 5000 righe o più causerà escalation di blocco. E sì - tu * puoi * spegnerlo - ma non penso che sarebbe un'ottima idea: se disabiliti l'escalation dei blocchi, stai ** affaticando molto di più ** e lavori sul blocco di SQL Server manager - anche se * potrebbe * impedire il blocco del Table, ridurrà ** le prestazioni ** in modo significativo. Dopo tutto: c'è un ** buon motivo ** perché SQL Server intensifica i blocchi dopo aver raggiunto 5000 per connessione .... –

+0

postare un [grafico deadlock] (http://msdn.microsoft.com/en-us/ library/ms190465.aspx) (l'XML, non l'immagine!). Raccomando di ripristinare le impostazioni predefinite (abilitare i blocchi di pagina). Non giocare con il napalm. Molto probabilmente ti mancano alcuni indici. –

+0

Non penso che i tuoi deadlock siano legati ai blocchi delle tabelle. Sono essenzialmente concetti diversi. Come ha detto Remus, non giocare con Napalm, c'è un motivo per cui queste ambientazioni sono lì. Comunque, come ho detto, un deadlock e un lock da tavolo sono concetti diversi tutti insieme. – Namphibian

risposta

8

escalation di blocco si attiva quando una dichiarazione detiene più di 5000 blocchi su un singolo oggetto. Una dichiarazione che tiene 3000 blocchi ciascuno su due diversi indici della stessa tabella non innescherà l'escalation.

Quando un'escalation dei blocchi viene tentata ed esiste un blocco in conflitto sull'oggetto, il tentativo viene interrotto e ritentata dopo un altro 1250 serrature (tenuto, non acquisito)

Quindi, se gli aggiornamenti vengono eseguiti su singole righe e si avere un indice di supporto sulla colonna, quindi bloccare l'escalation non è un problema.

È possibile verificarlo utilizzando l'evento Blocchi di blocco-> escalation da profiler.

Suggerisco di acquisire la traccia di deadlock per identificare la causa effettiva del deadlock.

+0

22/11/2012 16: 04: 28, spid8s, Sconosciuto, Grafico di attesa 11/22/2012 16: 04: 28, spid8s, Unknown, Deadlock rilevato .... Stampa informazioni deadlock 11/22/2012 16: 04: 23, spid27s, Unknown, waiter id = process1b8154988 22/11/2012 16: 04: 23, spid27s, Unknown, lista cameriere 22/11/2012 16: 04: 23, spid27s, Unknown, id proprietario = process1c962b048 11/22/2012 16: 04: 23, spid27s, sconosciuto, id proprietario = process23a98b948 11/22/2012 16: 04: 23, spid27s, sconosciuto, id proprietario = process172ecfdc8 22/11/2012 16: 04: 23, spid27s, Sconosciuto, id proprietario = process307993048 11/22/2012 16: 04: 23, spid27s, Sconosciuto, id proprietario = process228b81288 – Avias

+0

Gestire per ottenere alcuni vecchi log di traccia alcune settimane fa (pubblicato sopra questo post), che diavolo sto guardando qui? Onestamente non ho quasi idea di cosa sto guardando – Avias

+0

Dovrai fornire i dati di traccia completi per il deadlock. Puoi incollarlo su pastebin e condividere il link. Nota inoltre che potresti essere in grado di catturare il grafico di deadlock dopo il fatto utilizzando lo script citato in http://www.sqlskills.com/blogs/paul/post/getting-historical-deadlock-info-using-extended-events .aspx –

0

Ho trovato questo articolo dopo un rapido tentativo da parte di Google di disabilitare l'escalation del blocco tabella. Anche se non è una vera risposta per l'OP, penso che sia ancora pertinente per uno script e una nota degni di nota. C'è un piccolo trucco che puoi fare per disabilitare temporaneamente l'escalation del blocco del tavolo.
Aprire un'altra connessione ed emettere qualcosa di simile.

BEGIN TRAN 
SELECT * FROM mytable (UPDLOCK, HOLDLOCK) WHERE 1=0 
WAITFOR DELAY '1:00:00' 
COMMIT TRAN 

come

Blocco escalation non può verificare se un diverso SPID è attualmente in possesso un blocco di tabella incompatibile.

da microsoft kb