Nous exécutons actuellement une base de données sur SQL Server 2000. La base de données importe constamment des données à partir de fichiers plats pour les requêtes ultérieures. Ce processus est effectué par une série de procédures stockées SQL Server et appel BCP
à partir de ces procédures via xp_cmdshell
. Les scripts utilisent BCP
pour lire dans les fichiers plats dans des tables persistantes dans une base de données secondaire sur le même serveur. Ensuite, les scripts extraient les données des tables de la base de données d'importation et les placent dans la base de données réelle qui est normalisée et utilisée pour l'interrogation.SQL Server 2000 Truncate Deadlock
Normalement, ce processus d'importation prend 5-10 minutes en fonction de la taille des fichiers. Cependant, depuis une semaine, cela prend 50 à 60 minutes. Nous avons essayé de franchir les procédures. Nous avons remarqué que dès que nous créons une table temporaire, nous ne pouvons pas interroger tempdb
à partir d'une autre fenêtre de requête. Mais plus important encore, quand peut passer à travers bien jusqu'à ce que nous tronquons la première table d'importation. Nous permettons à la truncate de s'exécuter et lorsque nous vérifions les verrous dans la base de données en utilisant sp_lock
, nous voyons que les verrous pris par truncate ne sont pas libérés. Nous autorisons alors l'appel xp_cmdshell
à BCP
pour exécuter et il restera là. Nous regardons CPU et E/S et ne voyons aucune activité significative lorsque la procédure est bloquée appelant BCP. De plus, aucune autre requête connue n'est en cours d'exécution lorsque nous essayons cela. Notez que le fichier lui-même est petit; au plus 20 lignes.
Si nous courons la commande bcp
avec xp_cmdshell
à partir d'une requête distincte cela fonctionnera très bien, mais si nous enfermer avons exécuté la ligne de troncature, mais pas encore la ligne BCP
dans la procédure stockée.
Donc, les questions que nous avons sont pourquoi le serveur se dans cet état de blocage et moins important pourquoi les verrous effectués par tronquer ne libèrent pas?