Question

Arrière-plan. J'ai une question critique de la performance que je voudrais courir et je ne me soucie pas de lit sale

Ma question est; Si j'utilise les jointures, dois-je préciser l'indication NOLOCK sur ceux aussi bien?

Par exemple; est:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

équivalent à:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

Ou dois-je préciser l'indice de (NOLOCK) sur la jointure pour assurer que je ne suis pas bloquer la table jointe?

Était-ce utile?

La solution

Je ne vais pas répondre à l'argument READ UNCOMMITTED, juste votre question initiale.

Oui, vous avez besoin WITH(NOLOCK) sur chaque table de la jointure. Non, vos requêtes ne sont pas les mêmes.

Essayez cet exercice. Commencez une transaction et insérer une ligne dans Table1 et Table2. Ne pas valider ou annuler la transaction encore. A ce stade, votre première requête retourne avec succès et inclure les lignes non engagés; votre deuxième requête ne reviendra pas parce que table2 ne pas l'indice de WITH(NOLOCK) dessus.

Autres conseils

J'étais assez sûr que vous devez spécifier le NOLOCK pour chaque JOIN dans la requête. Mais mon expérience a été limitée à SQL Server 2005.

Quand je levais les yeux MSDN juste pour confirmer, je ne pouvais pas trouver quelque chose de précis. Les déclarations ci-dessous ne semblent me faire penser que pour 2008, vos deux déclarations ci-dessus sont équivalentes mais pour 2005, il est pas le cas:

  

[SQL Server 2008 R2]

     

Tous les conseils de verrouillage sont propagées à toutes les tables et vues qui sont accessibles par le plan de requête , y compris les tables et vues référencées dans une vue. En outre, SQL Server effectue les contrôles de cohérence de verrouillage correspondant.

     

[SQL Server 2005]

     

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

De plus, point à noter - et cela vaut pour 2005 et 2008:

  

Les indicateurs de table sont ignorés si la table n'est pas accessible par le plan de requête. Cela peut être causé par l'optimiseur choisissant de ne pas accéder à la table du tout, ou parce qu'une vue indexée est accessible à la place. Dans ce dernier cas, l'accès à une vue indexée peut être évité en utilisant l'indicateur de requête de OPTION (EXPAND VIEWS).

Ni. Vous définissez le niveau d'isolement READ UNCOMMITTED qui est toujours mieux que de donner serrure individuelle conseils. Ou, mieux encore, si vous vous souciez des détails comme cohérence , utilisez isolement de cliché .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top