2011-07-17 5 views
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 

ありがとうございます。

+1

カーソルが使用されているとわかると、procは間違っていて、書き直す必要があります - SQLはセットベースの言語なので、クエリの結果である自然なセットを使用してください。この場合、これはProduction.ProductからのSELECT - INSERT INTO sometable SELEcT ProductIDの結果を使用する単一のINSERTでなければなりません。 – Joe

+0

右、私はもっと同意できませんでした、私はdidntも、開発者がカーソルを使用したことを知っています – William

+0

あなたはなぜDEALLOCATE行が問題の原因だと思いますか?私は、セットベースの操作のループを2つの問題のうち大きい方にすることをお勧めしますが、ベストプラクティスとして、私はいつもCLOSEとDEALLOCATEの両方をカーソルとして使用します。 –

答えて

0

Yikes。ネストされたカーソルがあると、非常に多くのリソースが割り当てられる可能性があります。私はそれが間違いなくあなたの問題だとは言わないが、確かに問題です。

関連する問題