現在、SQL Server 2000でデータベースを実行しています。データベースは、後でクエリを実行するためにフラットファイルからデータを常にインポートします。このプロセスは、一連のSQL Serverストアドプロシージャによって実行されBCP
、それらのプロシージャからを介して呼び出されますxp_cmdshell
。スクリプトBCP
は、フラットファイルを同じサーバー上のセカンダリデータベースの永続テーブルに読み込むために使用します。次に、スクリプトはインポートデータベーステーブルからデータをプルし、正規化されてクエリに使用される実際のデータベースにデータを配置します。
通常、このインポートプロセスは、ファイルのサイズにもよりますが、5〜10分かかります。ただし、この1週間は、50〜60分かかりました。手順を踏んでみました。tempdb
一時テーブルを作成するとすぐに、別のクエリウィンドウからクエリを実行できないことに気付きました。しかし、もっと重要なのは、最初のインポートテーブルを切り捨てるまで、いつステップスルーできるかということです。切り捨ての実行を許可し、を使用してデータベース内のロックをチェックすると、sp_lock
切り捨てによって取得されたロックが解放されていないことがわかります。次にxp_cmdshell
、BCP
実行すると、そこに配置されます。CPUとI/Oを調べたところ、BCPの呼び出しでプロシージャがスタックしている場合、重要なアクティビティは見られません。また、これを試してみると、他の既知のクエリは実行されていません。ファイル自体が小さいことに注意してください。最大20行。
bcp
別のクエリからコマンドを実行すると、正常に機能しますが、切り捨て行を実行したが、ストアドプロシージャxp_cmdshell
の行がまだ実行されていない場合は、ロックアップします。BCP
それで、私たちが持っている質問は、なぜサーバーがこのデッドロック状態になるのか、そしてそれほど重要ではないのに、切り捨てによって作成されたロックが解放されないのかということです。