"Escalatie vergrendelen " is hoe SQL de vergrendeling afhandelt voor grote updates. Wanneer SQL veel rijen gaat veranderen, is het efficiënter voor de database-engine om minder, grotere vergrendelingen (bijv. hele tabel) te nemen in plaats van veel kleinere dingen te vergrendelen (bijv. rijvergrendelingen)
Maar dit kan problematisch zijn als je een enorme tafel hebt, omdat het blokkeren van de hele tafel andere vragen voor een lange tijd kan blokkeren. Dat is de afweging:veel vergrendelingen met kleine granulariteit zijn langzamer dan minder (of één) grofkorrelige vergrendelingen, en als meerdere query's verschillende delen van een tabel vergrendelen, ontstaat de mogelijkheid voor een impasse als het ene proces op het andere wacht.
Er is een optie op tabelniveau, LOCK_ESCALATION
, nieuw in SQL 2008, waarmee de escalatie van vergrendelingen kan worden beheerd. Met de standaard "TABEL" kunnen vergrendelingen helemaal naar het tafelniveau escaleren. UITSCHAKELEN voorkomt in de meeste gevallen escalatie van de vergrendeling naar de hele tabel. AUTO staat tafelvergrendelingen toe, behalve als de tafel is gepartitioneerd, in welk geval vergrendelingen alleen tot op partitieniveau worden gemaakt. Zie deze blogpost voor meer info.
Ik vermoed dat de IDE deze instelling toevoegt bij het opnieuw maken van een tabel, omdat TABLE de standaard is in SQL 2008. Merk op dat LOCK_ESCALATION niet wordt ondersteund in SQL 2005, dus u moet het verwijderen als u probeert het script uit te voeren op een 2005 voorbeeld. Bovendien, aangezien TABLE de standaard is, kunt u die regel veilig verwijderen wanneer u uw script opnieuw uitvoert.
Houd er ook rekening mee dat in SQL 2005 voordat deze instelling aanwezig was, alle vergrendelingen konden escaleren naar tabelniveau - met andere woorden, "TABEL" was de enige instelling in SQL 2005.