1. 首页>
  2. 技术文章>
  3. 如何收缩 SQL Server 中的 Tempdb 数据库

如何收缩 SQL Server 中的 Tempdb 数据库

3/3/21 9:17:59 AM 浏览 977 评论 0

SQL Server

如何收缩 SQL Server 中的 Tempdb 数据库,微软官方的文档:

https://support.microsoft.com/zh-cn/topic/%E5%A6%82%E4%BD%95%E6%94%B6%E7%BC%A9-sql-server-%E4%B8%AD%E7%9A%84-tempdb-%E6%95%B0%E6%8D%AE%E5%BA%93-ea0a95c2-eff8-7075-9ee2-2ee42226ca1c 

sqlserver tempdb过大,是查询sql没有优化的结果:

#查出最大的spid
use tempdb  
go  
SELECT top 10 t1.session_id,                                                      
t1.internal_objects_alloc_page_count,  t1.user_objects_alloc_page_count,  
t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,  
t3.login_name,t3.status,t3.total_elapsed_time  
from sys.dm_db_session_space_usage  t1   
inner join sys.dm_exec_sessions as t3   
on t1.session_id = t3.session_id   
where (t1.internal_objects_alloc_page_count>0   
or t1.user_objects_alloc_page_count >0  
or t1.internal_objects_dealloc_page_count>0   
or t1.user_objects_dealloc_page_count>0)  
order by t1.internal_objects_alloc_page_count desc  

#看是哪条sql导致的
select s.text,p.*
from master.dbo.sysprocesses p   
cross apply sys.dm_exec_sql_text(p.sql_handle) s  
where spid = 55

通过情况下重启sqlserver服务,所有的临时对象都会随着服务器重启而消失,tempdb数据库对象也会变到最小状态,

但是PRO环境下,我们不可以随意重启DB,所以在tempdb异常大的情况下,我们只能通过sql命令收缩数据库

USE [tempdb]
GO
DBCC SHRINKFILE (N'tempdev',0,RUNCATEONLY)  --释放所有可用空间
GO
DBCC SHRINKFILE (N'tempdev',100)   --收缩文件至 100M  ---此时会提升收缩失败
GO

----解决方法: 清除所有缓存,然后收缩tempdb数据库
USE [tempdb]
GO
DBCC FREESYSTEMCACHE ('ALL')
GO

DBCC SHRINKFILE (N'tempdev',100)
GO

另外,收缩数据库可以使用:

DBCC SHRINKDATABASE(数据库名,百分比)

百分比:即“收缩后文件中的最大可用空间”,取值范围“大于等于0, 小于100%”,实际使用中设为0即可。

网友讨论