web-dev-qa-db-fra.com

Un indice en cluster est-il verrouillé alors qu'un scan (index en cluster) est en cours?

La question est assez simple, comme le dit le titre. Cependant, je ne trouve aucune référence pour confirmer ou contredire cela.

Le problème me conduisant à cette question est que j'ai une vue en rejoignant plusieurs autres vues et tables. L'une de ces tableaux (appelons la table A) n'a pas eu de couverture indice non clusterné sur les colonnes dans les conditions de jointure et une analyse d'index en cluster a été publiée à la place.

L'effet était que toutes les autres requêtes qui utilisaient également la table A et utilisaient une analyse d'index en cluster à effectuer attendre après la première requête (pas de blocage, car j'ai un délai important). Dès que j'ai créé un index non clusterné sur la table A pour les colonnes de jointure, l'indice en clustered n'était plus utilisé et les requêtes ont commencé à fonctionner correctement en parallèle.

Quoi qu'il en soit, si mon hypothèse est correcte, existe-t-il un moyen de détecter la serrure? Je n'ai pas encore essayé d'émettre des drapeaux de trace lié à verrouillage? Je n'ai utilisé que 'sp_who2' et quelques autres requêtes trouvées ici pour l'instant.

Si vous avez trébuché sur cela avant, veuillez partager vos pensées.

6
Marcel N.

Il y a beaucoup de nombreux autres facteurs en jeu.

  • niveau d'isolement. Le comportement de verrouillage diffère sauvagement entre les niveaux d'isolation. Certains ne se verrouillent pas du tout (lire non engagés, instantanés, RCSI). La valeur par défaut a été commise les rangées de verrouillage transitoyablement des rangées qui se lit aussi longtemps que nécessaire. Lecture répétable et sérialisable tenez-la pour verrouiller et finir par verrouiller tout, et de nombreux développeurs déploient sérialisisable sans jamais réaliser qu'ils le font .
  • numérisation du but. Les analyses à lecture sont compatibles les unes avec les autres afin qu'ils ne bloquent pas, peu importe ce qu'ils se verrouillent. Si vous avez des analyses qui bloquent d'autres analyses, ils doivent être des analyses pour la mise à jour, qui sont incompatibles les unes avec les autres. Encore une fois, le niveau d'isolation de l'instantané (y compris la RCSI) ne bloque pas même lors de la mise à jour de la mise à jour.
  • verrouiller la granularité, basée sur des estimations de cardinalité. Les analyses peuvent choisir la granularité de ligne, de page ou de niveau de rangée. Une analyse de table choisira probablement des serrures de page.
  • index Page Serrures/Ligne Verrouillage Configuration, que vous avez modifiées par inadvertance. Vous devez rétablir le changement, car n'est pas basé sur une analyse de mesure et de cause à base de la cause. Le sentiment de gut n'a aucun rôle dans l'enquête .
  • Serrure Escalation
  • exigences de stabilité en ligne lorsque les données LOB hors ligne sont présentes
  • autre

Je suggère que vous suivez la procédure décrite dans capturer des statistiques d'attente pour une seule opération Pour capturer les statistiques d'attente des scans que vous avez observés comme blocage. SE Si en effet, ils bloquent des serrures tenues par l'opération de balayage de la table. Si le scénario est vraiment tel que vous avez décrit (lire scanner contre d'autres opérations de lecture), il n'y a aucune raison de bloquer pour que autre chose soit en jeu. Vous pouvez également donner sp_whoisactive un coup.

5
Remus Rusanu