0
私はいくつかのリソースに向かって私を指すことができるか、これについてのいくつかの個人的な経験を共有する人に本当に感謝します。SQL Server 2000上のSQLカーソルからメモリを解放しないとどうなりますか?
私のSQL 2kボックスCPUが100%近くで固定されていることに気がつきました.SQLカーソルを使用していたメモリを割り当て解除していないetlプロセスとほとんど同じ時間にスパイクしました。私は停止してサービスを開始し、問題を修正しました。
このetlプロセスは、朝早く失敗し、サーバーがスパイクしたときにプロセスを手動で再実行していました。
結論として、私の質問はこれです:etlプロセスがサーバーをスパイクさせている可能性があることは明らかですが、メモリを割り当て解除しなかったこの手順で、この問題。クエリは次のようになります。
USE AdventureWorks
GO
DECLARE @ProductID INT
DECLARE @getProductID CURSOR
SET @getProductID = CURSOR FOR
SELECT ProductID
FROM Production.Product
OPEN @getProductID
FETCH NEXT
FROM @getProductID INTO @ProductID
WHILE @@FETCH_STATUS = 0
BEGIN
Insert into sometable values(@ProductID)
FETCH NEXT
FROM @getProductID INTO @ProductID
END
CLOSE @getProductID
GO
ありがとうございます。
カーソルが使用されているとわかると、procは間違っていて、書き直す必要があります - SQLはセットベースの言語なので、クエリの結果である自然なセットを使用してください。この場合、これはProduction.ProductからのSELECT - INSERT INTO sometable SELEcT ProductIDの結果を使用する単一のINSERTでなければなりません。 – Joe
右、私はもっと同意できませんでした、私はdidntも、開発者がカーソルを使用したことを知っています – William
あなたはなぜDEALLOCATE行が問題の原因だと思いますか?私は、セットベースの操作のループを2つの問題のうち大きい方にすることをお勧めしますが、ベストプラクティスとして、私はいつもCLOSEとDEALLOCATEの両方をカーソルとして使用します。 –