2009-11-09 5 views
110

Lors de la modification d'une table (suppression d'une colonne) dans SQL Server 2008, j'ai cliqué sur le bouton Générer le script de modification et j'ai remarqué que le script de modification générait la colonne, indique "go" et exécute une instruction ALTER TABLE supplémentaire pour définir l'escalade de verrouillage de la table sur "TABLE". Exemple:Escalade de verrouillage - Que se passe-t-il ici?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

Je devrais également noter que c'est la dernière chose que fait le script de modification. Que fait-il ici et pourquoi définit-il LOCK_ESCALATION à TABLE?

Répondre

141

"Lock Escalation" est la manière dont SQL gère le verrouillage pour les mises à jour importantes. Lorsque SQL doit modifier un grand nombre de lignes, il est plus efficace pour le moteur de base de données de prendre moins de verrous plus grands (par exemple table entière) au lieu de verrouiller beaucoup de petites choses (par exemple verrous de ligne).

Mais cela peut poser problème lorsque vous avez une table volumineuse, car le fait de verrouiller la totalité de la table peut bloquer d'autres requêtes pendant longtemps. C'est le compromis: beaucoup de verrous de petite granularité sont plus lents que moins (ou un) verrous grossiers, et avoir plusieurs requêtes verrouillant différentes parties d'une table crée la possibilité de blocage si un processus attend un autre.

Il existe une option de niveau table, LOCK_ESCALATION, nouvelle dans SQL 2008, qui permet de contrôler l'escalade de verrous. La valeur par défaut, "TABLE", permet aux verrous de s'élever jusqu'au niveau de la table. DISABLE empêche l'escalade du verrou sur la totalité de la table dans la plupart des cas. AUTO autorise les verrous de table sauf si la table est partitionnée, auquel cas les verrous ne sont créés que jusqu'au niveau de la partition. Voir this blog post pour plus d'informations.

Je suppose que l'EDI ajoute ce paramètre lors de la recréation d'une table car TABLE est la valeur par défaut dans SQL 2008. Notez que LOCK_ESCALATION n'est pas supporté dans SQL 2005, vous devrez donc le supprimer si vous essayez de l'exécuter le script sur une instance 2005. De plus, comme TABLE est la valeur par défaut, vous pouvez supprimer cette ligne en toute sécurité lors de la réexécution de votre script.

Notez également que, dans SQL 2005 avant que ce paramètre était présent, tous les verrous ne dégénèrent à la table level-- autrement dit « TABLE », était le seul paramètre sur SQL 2005.

+1

post dupliquées sur les forums MSDN ainsi: http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 –

+0

@JustinGrant: cette expression peut être combiné avec l'instruction 'CREATE TABLE'? –

+6

@dma_k - Cette option n'est pas pertinente pour 'CREATE TABLE' car la table n'existe pas encore, donc il n'y a rien à verrouiller. –

6

Vous pouvez vérifier si vous besoin d'inclure la déclaration LOCK_ESCALATION dans votre script en comparant cette valeur avant et après l'exécution de la partie principale de votre script:

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename' 

dans mon cas, la modification table pour déposer ou ajouter une contrainte ne semble pas modifier cette valeur.

Questions connexes