0

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?

Répondre

0

Les verrous dans SQL Server ne sont conservés que s'il existe une transaction active. Vous devez valider la transaction avant d'appeler le BCP externe. Sinon, vous allez rencontrer ce blocage. Incidemment, ce blocage ne peut pas être détecté par SQL Server. Si cela se produit, vous serez bloqué pour toujours.