2010-06-09 7 views
14

Ex)Quel est le but de ROWLOCK lors de la suppression et quand devrais-je l'utiliser?

Quand dois-je utiliser cette déclaration:

DELETE TOP (@count) 
FROM ProductInfo WITH (ROWLOCK) 
WHERE ProductId = @productId_for_del; 

Et Quand faut-il faire juste:

DELETE TOP (@count) 
FROM ProductInfo 
WHERE ProductId = @productId_for_del; 
+1

N'utilisez pas d'astuces sauf si vous en avez réellement et savez quelles sont les conséquences possibles. –

Répondre

19

Le with (rowlock) est un indice qui indique à la base de données qu'il doit conserver les verrous sur une étendue de ligne. Cela signifie que la base de données évite l'escalade des verrous pour bloquer ou définir la portée.

Vous utilisez l'indicateur lorsque seule une ou quelques lignes seront affectées par la requête, pour empêcher le verrouillage des lignes qui ne seront pas supprimées par la requête. Cela permettra à une autre requête de lire des lignes non liées en même temps au lieu de devoir attendre la fin de la suppression. Si vous l'utilisez sur une requête qui va supprimer beaucoup de lignes, cela peut dégrader les performances car la base de données essaiera d'éviter d'élever les verrous à une plus grande portée, même si cela aurait été plus efficace.

Normalement, vous ne devriez pas avoir besoin d'ajouter de telles indications à une requête, car la base de données connaît le type de verrou à utiliser. C'est uniquement dans les situations où vous rencontrez des problèmes de performance car la base de données a pris la mauvaise décision, que vous devez ajouter de tels conseils à une requête.

+0

Suggéreriez-vous de l'utiliser sur une instruction de suppression qui supprime 2000 lignes à la fois dans une boucle? – RPS

+0

La base de données devrait être capable de prendre la décision toute seule. Il s'aggravera s'il voit une bonne raison de le faire. J'éviterais de trop le gouverner (ce que fait une allusion) à moins d'avoir une bonne raison de le faire, comme si je savais quelque chose que la base de données n'a pas. – Brandon

+0

@Brandon: Oui, c'est un bon point. Normalement, la base de données sait quel verrou utiliser, bien mieux qu'un programmeur. – Guffa

4

Dame de nage est un indicateur de requête qui doit être utilisé avec précaution (comme tous les conseils de requête).

En l'omettant, il en résultera vraisemblablement toujours le même comportement et à condition qu'il ne garantisse pas qu'il n'utilisera qu'un rowlock, ce n'est qu'un indice après tout. Si vous n'avez pas une connaissance très approfondie des conflits de verrous, il est probable que l'optimiseur choisira la meilleure stratégie de verrouillage possible, et il vaut mieux laisser ces choses au moteur de la base de données. ROWLOCK signifie que SQL verrouillera uniquement la ligne affectée, et non la totalité de la table ou la page de la table où les données sont stockées lors de la suppression. Cela n'affectera que les personnes lisant la table en même temps que votre suppression.

Si un verrou de table est utilisé, toutes les requêtes sur la table sont attendues jusqu'à ce que la suppression soit terminée. Un verrou de ligne sélectionne uniquement la lecture que les lignes spécifiques attendent.

La suppression de la partie supérieure N où N est un nombre de lignes bloquera probablement la table dans tous les cas.

Questions connexes