60 votes

Utilisation d'un indice de table WITH NOLOCK dans une requête utilisant une vue - Se propage-t-il dans la vue ?

Si une indication de requête "WITH NOLOCK" est utilisée sur une vue dans SQL Server, cette indication se propage-t-elle à la définition de la vue elle-même, même si NOLOCK n'est PAS utilisé pour les tables brutes dans la définition de la vue ? La raison pour laquelle nous avons besoin de cela est que, parfois, le personnel de soutien veut faire d'énormes requêtes qui prennent beaucoup de temps, mais préfère ne pas forcer ce verrouillage sur toutes les requêtes utilisant la vue dans l'application elle-même.

69voto

Rory Points 13087

Oui, NOLOCK se propagera aux tables utilisées par la définition de la vue (au moins dans SQL Server 2005).

Voir Conseils pour la table dans MSDN :

En SQL Server 2005, toutes les indications de verrouillage sont propagées à toutes les tables et vues qui sont référencées dans une vue. De plus, SQL Server effectue les contrôles de cohérence des verrous correspondants.

Cependant,

Si une table contient des colonnes calculées et que ces colonnes sont calculées par des expressions ou des fonctions accédant à des colonnes d'autres tables, les indices de table ne sont pas utilisés sur ces tables. Cela signifie que les conseils de table ne sont pas propagés. Par exemple, une indication de table NOLOCK est spécifiée sur une table dans la requête. Cette table comporte des colonnes calculées par une combinaison d'expressions et de fonctions qui accèdent aux colonnes d'une autre table. Les tables référencées par les expressions et les fonctions n'utilisent pas l'indication de table NOLOCK lors de leur accès.

Si vous utilisez des vues indexées, vous devriez lire un peu plus car il y a aussi des cas particuliers.

Voir aussi Voir la résolution pour plus d'informations.

12voto

Jim V. Points 776

Juste pour compléter l'excellente réponse de Rory.

Il écrit : "Oui, NOLOCK se propagera aux tables utilisées par la définition de la vue. (au moins dans SQL Server 2005) ."

En fait, cela fonctionnera également dans SQL 2000. De BOL :

Étant donné que select_statement utilise l'instruction SELECT, il est valable d'utiliser et de faire des allusions comme spécifié dans la clause FROM. Pour plus d'informations, voir DE y SÉLECTIONNER .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X