Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Lock Escalation - Cosa sta succedendo qui?

"Blocca escalation " è il modo in cui SQL gestisce il blocco per aggiornamenti di grandi dimensioni. Quando SQL modifica molte righe, è più efficiente per il motore di database utilizzare meno blocchi più grandi (ad esempio l'intera tabella) invece di bloccare molte cose più piccole (ad esempio blocchi di riga) .

Ma questo può essere problematico quando hai una tabella enorme, perché prendere un blocco sull'intera tabella può bloccare altre query per molto tempo. Questo è il compromesso:molti blocchi di piccola granularità sono più lenti di meno (o uno) blocchi a grana grossa e avere più query che bloccano parti diverse di una tabella crea la possibilità di deadlock se un processo è in attesa di un altro.

C'è un'opzione a livello di tabella, LOCK_ESCALATION , nuovo in SQL 2008, che consente il controllo dell'escalation dei blocchi. L'impostazione predefinita "TABELLA" consente ai blocchi di aumentare fino al livello della tabella. DISABLE impedisce l'escalation del blocco all'intera tabella nella maggior parte dei casi. AUTO consente i blocchi della tabella tranne se la tabella è partizionata, nel qual caso i blocchi vengono creati solo fino al livello di partizione. Vedi questo post del blog per maggiori informazioni.

Sospetto che l'IDE aggiunga questa impostazione durante la ricreazione di una tabella perché TABLE è l'impostazione predefinita in SQL 2008. Nota che LOCK_ESCALATION non è supportato in SQL 2005, quindi dovrai rimuoverlo se provi a eseguire lo script su un Istanza del 2005. Inoltre, poiché TABLE è l'impostazione predefinita, puoi rimuovere in sicurezza quella riga quando riesegui lo script.

Si noti inoltre che, in SQL 2005 prima che questa impostazione fosse presente, tutti i blocchi potevano passare a livello di tabella, in altre parole, "TABLE" era l'unica impostazione su SQL 2005.