Glo*_*obe 5 sql sql-server memory-leaks memory-management
我有一个大的游标基础查询,它在作业下的存储过程中运行.它整天在一个循环中对大量市场数据进行大量计算.每个这样的迭代都会从磁盘中汇集历史时间序列,将其填充到具有适当索引的临时表中,将它们连接到具有中间结果的多个结构中,并将计算输出存储到磁盘.在每个循环结束时,我(主要)删除或截断所有临时表以释放tempdb内的用户对象页面,并为下一次迭代准备名称空间.
我的问题是,在每个循环后,所有内部对象,DB Engine为查询执行创建并将它们转储到tempdb, - 保留为它们保留的磁盘空间,甚至在事务提交后释放.随着下一批新的内部对象被刷到磁盘,它会累积到每个周期.
它导致永久的tempdb集合,所有累积的保留空间都与新的和新的解除分配的内部对象相关.数据库引擎仅在会话结束时,当proc完成它的循环时,释放/缩小(无论如何)这些浪费的磁盘空间.
我可以通过减少每个作业运行中的循环次数来解决问题,然后再次启动它.但我想要一个完整的基本决定:我需要在会话中使用命令或任何类型的技巧来强制垃圾收集,以完全清理/终止已解除分配的内部对象并释放为它们保留的tempdb磁盘空间.几天的谷歌搜索没有帮助.伙计们,帮忙!
我们有完全相同的问题:
为了解决这个问题,我们只是将进程划分为小进程,在单独的会话中执行每个进程,但是链接起来(为了避免阻塞问题) - 当执行第一部分时,它会启动下一部分,然后它被执行,它会触发下一个。
例如(如果您有办法链接计算),您可以中断循环迭代以单独调用具有不同参数的过程。在不同的会话中执行,当每个会话完成时,页面将被释放。
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |