Question

Je suis un développeur Rapport qui veut faire mes requêtes aussi efficace que possible. Je travaillais avec un DBA qui m'a dit - je crois parce que je toujours affaire à des rapports sur un serveur de production - à l'utilisation NOLOCK dans chaque requête.

Maintenant, je travaille avec un DBA qui a interdit NOLOCK en aucun cas - même si un rapport de mes (en raison d'un manque considérable d'indices sur deux tables) stoppe les mises à jour de réplication et de système. À mon avis, dans ce cas, un NOLOCK serait une bonne chose.

Comme la plupart de ma formation SQL est venu avec diverses DBAs opinions très différentes, je voulais poser à une grande variété de CBM.

Était-ce utile?

La solution

Si vos blocs de rapport mises à jour que votre DBA est bon: vous devez absolument pas utiliser NOLOCK. Le fait qu'il ya sont conflits est une indication claire que si vous serait sale utilisation que vous obtiendriez lit des rapports incorrects.

À mon avis, il y a toujours de meilleures alternatives que NOLOCK:

  • Vos tables de production en lecture seule en vigueur et ne sont jamais modifiés? Marquez la base de données en lecture seule!
  • Tableau balaye les conflits de verrouillage de cause? Index des tableaux de façon appropriée, les avantages sont multiples.
  • Impossible de modifier / ne sais pas comment indexer correctement? Utilisez INSTANTANÉ ISOLEMENT .
  • Impossible de modifier l'application à l'instantané de l'utilisation? Allumez lire snapshot commis!
  • Vous avez mesuré l'impact de la ligne et ont versioning preuve son impact sur la performance? Vous ne pouvez pas indexer les données? et vous êtes OK avec rapports incorrects ? Ensuite, à tout le moins vous faire une faveur et utiliser SET TRANSACTION ISOLATION LEVEL , pas un soupçon de requête. Il sera plus facile de fixer plus tard, le niveau d'isolement au lieu de modifier toutes les requêtes.

Autres conseils

Il est pas toujours mauvais.

Bien sûr, il vous permet de lire des valeurs non engagés (qui peuvent être annulées et donc logiquement jamais existé) ainsi que des phénomènes tels que les valeurs permettant plusieurs fois la lecture ou pas du tout.

Les seuls niveaux d'isolement qui garantie que vous ne rencontrerez aucun de ces anomalies sont snapshot / sérialisable. Sous des valeurs de lecture répétables peuvent manquer si une ligne est déplacé (en raison d'une mise à jour clé) avant le cours d'analyse cette ligne, sous les valeurs engagées lues peuvent être lues deux fois si une mise à jour clé provoque une ligne lue précédemment pour aller de l'avant.

Ces questions sont plus susceptibles de se produire dans nolock mais parce que, par défaut, à ce niveau d'isolement, il utilisera peut être bien pire .

Vos clients tolèrent des résultats incohérents dans les rapports? Si la réponse est non, vous ne devriez pas utiliser NOLOCK - vous pouvez obtenir des résultats erronés en concurrence. J'ai écrit quelques exemples , et ici . Ces exemples montrent un résultat incohérent sous READ COMMITTED et répétables READ, mais vous pouvez les modifier et d'obtenir des résultats erronés avec NOLOCK ainsi.

La plupart des rapports que je crée ne sont pas exécutés sur les données actuelles. La plupart des clients sont de rapports en cours d'exécution sont les données d'hier. Est-ce que votre changement de réponse si tel était le cas?

Si tel est le cas, alors vous avez une option plus possible:
Au lieu d'exécuter vos requêtes sur la base de données de production et de déconner avec des serrures et NOLOCK, vous pouvez exécuter vos rapports à partir d'une copie de la base de données de production.

Vous pouvez le configurer de sorte il est restauré automatiquement à partir d'une sauvegarde chaque nuit.
Apparemment, vos rapports sont en cours d'exécution sur les serveurs sur les sites des clients, donc je ne sais pas si cette mise en place serait une solution viable pour vous.
(mais là encore ... ils devraient avoir des sauvegardes de toute façon, tout ce que vous avez besoin est un espace de serveur pour les restaurer)

Je suis un développeur en interne, donc c'est plus facile pour moi parce que j'ai un contrôle total sur les serveurs et bases de données.

Vous pouvez le faire au moins pour les rapports qui ont seulement besoin des données d'hier et plus. Peut-être que certains rapports devront rester sur la base de données de production, mais au moins vous déplacer une partie de la charge à une autre base de données (ou mieux encore, un autre serveur).

J'ai la même situation au travail ainsi:
Nous utilisons une copie de la base de données de production comme celui-ci pour presque tous les trucs de rapports, mais il y a quelques requêtes qui nécessitent des données d'aujourd'hui.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top