web-dev-qa-db-fra.com

Utilisation de l'indicateur de table WITH NOLOCK dans une requête à l'aide de la vue - Propage-t-elle dans la vue?

Si une indication de requête "WITH NOLOCK" est utilisée sur une vue dans SQL Server, la propage-t-elle à la définition de vue elle-même, même si NOLOCK n'est PAS utilisé pour les tables brutes dans la définition de vue? La raison pour laquelle cela est nécessaire est que le personnel de support souhaite parfois effectuer d'énormes requêtes chronophages mais préfère ne pas forcer ce verrouillage sur toutes les requêtes utilisant la vue dans l'application elle-même.

57
Turnkey

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

Voir Conseils de tablea dans MSDN:

Dans SQL Server 2005, tous les conseils de verrouillage sont propagés à toutes les tables et vues référencées dans une vue. En outre, SQL Server effectue les vérifications de cohérence de verrouillage correspondantes.

Cependant,

Si une table contient des colonnes calculées et que les colonnes calculées sont calculées par des expressions ou des fonctions accédant aux colonnes d'autres tables, les indications de table ne sont pas utilisées sur ces tables. Cela signifie que les indications de tableau ne sont pas propagées. Par exemple, une indication de table NOLOCK est spécifiée sur une table de la requête. Cette table a des colonnes calculées qui sont 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'indicateur de table NOLOCK lors de l'accès.

Si vous utilisez des vues indexées, vous voudrez peut-être en lire un peu plus car il existe également des cas particuliers.

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

67
Rory

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

Il écrit "Oui, NOLOCK se propage 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 valide de l'utiliser et des indications comme spécifié dans la clause FROM. Pour plus d'informations, consultez DANS et SÉLECTIONNEZ .

12
Jim V.