我经常收到错误"无法为数据库分配新页面' TEMPDB'因为文件组中的磁盘空间不足' FileGroup_Name'"执行一个存储过程时。我稍微重构了SP,但是有一个问题:这个错误可能突然发生在prod上,我无法在测试环境中重复它。因此,测试我的更改的单一方法是 - 测量“FileGroup_Name”中的磁盘空间。磁盘空间。
所以,问题是"如何衡量SP执行期间采取的文件组磁盘空间"?
P.S。我知道可以增加空间,但由于某些原因,在我目前的情况下这不是一个合适的解决方案。
答案 0 :(得分:1)
尝试在SSMS中执行sp以获取实际的执行计划,而不是监视tempdb磁盘空间。
可能不是你的临时对象溢出tempdb,而是排序/散列溢出,它们将在实际计划中报告。
或者您可以监控tempdb的吃什么时间和吃什么。
例如,我使用脚本根据以下视图对其进行监控:
create view [dbo].[vw_tempdb_usage]
as
select session_id,
cast(sum(internal_objects_alloc_page_count) * 8. /1024 /1024 as decimal(10,2))as internal_objects_alloc_Gb,
cast(sum(internal_objects_dealloc_page_count) * 8. /1024 /1024 as decimal(10,2))as internal_objects_dealloc_Gb,
cast(sum(user_objects_alloc_page_count) * 8. /1024 /1024 as decimal(10,2))as user_objects_alloc_Gb,
cast(sum(user_objects_dealloc_page_count) * 8. /1024 /1024 as decimal(10,2))as user_objects_dealloc_Gb,
cast(sum(internal_objects_alloc_page_count -
internal_objects_dealloc_page_count) * 8. /1024 /1024 as decimal(10,2))as internal_objects_diff_Gb,
cast(sum(user_objects_alloc_page_count -
user_objects_dealloc_page_count)* 8. /1024 /1024 as decimal(10,2)) as user_objects_diff_Gb
from sys.dm_db_task_space_usage
group by session_id
having sum(internal_objects_alloc_page_count - internal_objects_dealloc_page_count +
user_objects_alloc_page_count - user_objects_dealloc_page_count) /1024 > 0
您可以通过session_id将其加入sys.dm_exec_sessions
和sys.dm_exec_requests
,并获取当前执行的语句以查看正在增长的内容。在我们的环境中,有些内部对象往往会溢出tempdb,它们总是由内部排序引起。所以我的建议是使用实际执行计划找到tempdb溢出。