2009-11-18 5 views
5

J'ai une requête simple comme celui-ciPourquoi cette instruction SELECT verrouille-t-elle SQL Server?

SELECT * FROM MY_TABLE; 

Quand je le lance, se bloque SQL Server Management Studio.

D'autres tables et vues fonctionnent correctement.

Que peut provoquer cela? J'ai eu des verrous tout en exécutant des instructions UPDATE avant, et je sais comment les aborder. Mais qu'est-ce qui pourrait provoquer un verrouillage de SELECT?

J'ai exécuté le rapport "Toutes les transactions de blocage", et il dit qu'il n'y en a aucun.

Répondre

10

Il est sans doute pas la sélection qui bloque, mais un autre processus qui est l'édition (udpate/supprimer/insérer) la table qui est à l'origine des serrures.

Vous pouvez voir quel processus bloque en exécutant exec sp_who2 sur votre serveur SQL.

Sinon, si vous êtes OK avec lit sale, vous pouvez faire une des deux choses

SELECT * FROM Table WITH (NOLOCK) 

OU

SET Transaction Isolation Level Read Uncommitted 
SELECT * FROM Table 
+0

exec sp_who2 m'a donné un ALTER INDEX en cours. Semble être le coupable. Merci. – JosephStyons

3

Utilisez ceci:

SELECT * FROM MY_TABLE with (NOLOCK) 
+0

Cela fonctionne, mais comment puis-je savoir qui/quoi cause le verrouillage? – JosephStyons

+0

Voir la réponse de BradC: Un autre processus a un verrou sur la table, empêchant votre sélection de se poursuivre jusqu'à ce que ce verrou soit libéré – Mikhail

1

Deux possibilités:

  1. Son une table vraiment massif , et vous essayez de retourner 500m lignes.
  2. Un autre processus a un verrou sur la table, empêchant votre choix de passer jusqu'à ce que le verrou soit libéré.
+0

Non à # 1. Oui à # 2 mais qui/quoi? – JosephStyons

+0

@BradC dans # 1 est 500m signifie 500 millions, ou est-ce quelque chose d'autre. – robert

+0

@robert, oui je voulais dire 500 millions, ou un autre nombre absurdement élevé. – BradC

3

S'il y a beaucoup d'autres activités en cours, quelque chose d'autre pourrait causer des verrous, et votre SELECT pourrait être la victime de l'interblocage. si vous exécutez la commande suivante

SELECT * FROM my_table WITH(nolock) 

vous dire la base de données que vous êtes autorisé à lire les données sales (uncomitted), et que les verrous causés par d'autres activités peuvent être ignorés sans risque.

En outre, si une requête comme qui provoque studio de gestion pour accrocher, votre table peut utiliser une optimisation

1

MY_TABLE pourrait aussi être bloqué par une transaction non validée - par exemple script/procédure stockée en cours d'exécution (ou a échoué lors de l'exécution) dans une autre fenêtre MSMM.

Questions connexes