有时我们的开发人员会编写一个使用游标的查询,但不会明确关闭它们。我正在尝试在我的生产数据库中生成一个活动对象列表,这些活动对象使用游标但没有明确关闭/取消分配它们。为此,我编写了一个简单的语句来完成这项工作,但速度非常慢:
select distinct name,
definition
from SYS.SQL_MODULES
inner join SYS.OBJECTS O
on SQL_MODULES.OBJECT_ID = O.OBJECT_ID
where SQL_MODULES.DEFINITION like '%open%'
and SQL_MODULES.DEFINITION like '%declare % cursor%'
and ( SQL_MODULES.DEFINITION not like '%close%'
or SQL_MODULES.DEFINITION not like '%deallocate%' )
目前,这大约需要 3 分钟才能运行。有没有更好的方法来获取我正在寻找的信息?
与其在所有存储过程文本中搜索这些通配符,不如查找打开的游标及其相关文本可能会更好。这可能会更容易找到由健忘的开发人员编写的游标名称、存储过程等。
要进行测试,请在一个窗口中运行:
然后在另一个窗口中运行:
您应该会看到游标已打开并被此处的其他会话挂起,以及任何其他打开的游标。
如果您需要监控这些(并且您没有监控工具),您可以使用 dormant_duration 列并使用代理作业轮询 DMV,当打开的游标休眠特定时间时,代理作业将触发警报或电子邮件多少时间。以毫秒为单位。
希望这可以帮助!