如何收缩 SQL Server 中的 Tempdb 数据库,微软官方的文档:
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即可。