Memory 不从SQLServer2000上的sql游标释放内存会产生什么后果?

Memory 不从SQLServer2000上的sql游标释放内存会产生什么后果?,memory,sql-server-2000,cursor,Memory,Sql Server 2000,Cursor,我非常感谢任何能为我提供一些资源或分享一些个人经验的人 我注意到,我的SQL2K盒cpu的峰值接近100%,几乎与使用sql游标但未释放内存的etl进程失败的时间完全相同。我停止并启动了服务,它解决了问题 该etl过程在早上早些时候失败,当服务器出现峰值时,开发人员正在手动重新运行该过程 总之:我的问题是:很明显,etl过程可能导致服务器崩溃,但是,我想知道这个没有释放内存的过程是否/如何/为什么会导致这个问题。查询与此类似: USE AdventureWorks GO DECLARE @Pro

我非常感谢任何能为我提供一些资源或分享一些个人经验的人

我注意到,我的SQL2K盒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

非常感谢。

Yikes。您有一个嵌套游标,它可以创建大量已分配的资源。我不会说这肯定是你的问题,但这肯定是一个问题。

95%的时候,如果你看到正在使用的游标,过程是错误的,需要重写-SQL是一种基于集合的语言,所以使用查询结果的自然集合。在本例中,这应该是使用SELECT-INSERT INTO sometable SELECT ProductID from Production.Product.Right的结果进行的单次插入。我完全同意,我甚至不知道开发人员使用了游标。为什么您认为缺少DEALLOCATE语句是问题的原因?我建议为基于集合的操作创建一个循环是这两个问题中较大的一个,但是作为一个最佳实践,我总是对游标使用CLOSE和DEALLOCATE。