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
- ha una grande quantità di righe (da 1 a 2 milioni)
- 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
- 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)
- 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
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 .... –
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. –
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