1. 什么是tempdb?
tempdb是SqlServer中一个系统数据库,它在每个实例中只有一个。默认情况下,它是在SqlServer安装时自动创建的。tempdb用于存储临时对象,包括临时表、表变量和存储过程中的一些中间结果集等。它被广泛用于存储临时数据,以便于多个用户会话或请求能够同时访问。实际上,当请求操作需要临时使用数据的时候,它们会在tempdb中创建临时对象。tempdb的大小及性能对SqlServer的整体运行非常关键。
2. tempdb的日志机制原理
tempdb中的数据修改操作,都会记录在tempdb的日志文件中。而tempdb的日志文件并不像其他数据库的日志文件一样存在于磁盘,而是被存储在内存中,SqlServer会将内存中的日志信息写入到tempdb的磁盘文件中。
2.1 tempdb日志文件的作用
tempdb日志文件的主要作用是,当临时对象创建时发生了系统崩溃、断电等情况的时候,通过日志文件可以将数据还原到崩溃之前的状态。
2.2 tempdb中的日志记录类型
tempdb中的日志记录类型有:insert、delete、update、truncate和DDL操作等。其中,insert、delete、update和truncate属于数据修改类型的操作,DDL操作是表结构修改相关的操作,包括创建、修改、删除表等。
2.3 tempdb中事务的提交顺序
tempdb中事务的提交顺序是先写入日志文件,再进行数据修改。这种提交顺序可以确保在任何时间点都可以通过tempdb的日志文件来还原数据。
3. tempdb的性能优化建议
由于tempdb的大小及性能对SqlServer的整体运行非常关键,因此需要针对tempdb进行优化。
3.1 分配足够的空间
tempdb经常发生数据变化,因此要确保分配给它足够的空间,以免频繁的扩展导致性能降低。
--查询tempdb的大小及空闲空间
USE tempdb;
GO
EXEC sp_spaceused;
GO
3.2 设置多个文件
通过设置多个文件,可以提高tempdb的并发性,减轻磁盘I/O的负担,从而提高性能。
--增加tempdb的文件数量及大小
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev2,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\tempdb2.mdf',
SIZE = 2GB,
MAXSIZE = Unlimited,
FILEGROWTH = 10%
);
3.3 避免长事务的使用
tempdb中的日志文件随着提交的事务越来越多,因此长事务的使用会导致tempdb中的日志文件越来越大,由此会给系统带来性能问题。
3.4 避免频繁创建和删除临时对象
频繁创建和删除临时对象会导致tempdb中的日志文件越来越大,从而影响性能。建议在实际使用中尽可能地共享已有的临时对象。
3.5 防止系统对象缓存的不正常释放
系统对象缓存是SqlServer中的一个系统模块,tempdb中的表和过程都存储在其中。如果系统对象缓存的清除不及时,会导致系统出现内存泄露,从而引发性能问题。
4. 示例分享
下面是一个查询tempdb中活动用户数的示例。
--查询tempdb中活动用户数
USE master;
GO
SELECT waiting_tasks_count AS wt,
wait_time_ms/1000. AS wTime_Sec,
signal_wait_time_ms/1000. AS Sig_wTime_Sec
FROM sys.dm_os_waiting_tasks
WHERE wait_type LIKE 'PAGELATCH_%'
GO
该查询会返回等待PAGELATCH的数量和等待时间。如果等待时间过长,则可能需要针对tempdb进行性能优化。
结论
tempdb是SqlServer中非常重要的一个系统数据库,它被广泛用于存储临时对象。tempdb中的数据修改操作都会记录在tempdb的日志文件中,日志文件是还原数据的关键。为了提高tempdb在SqlServer中的性能,应该分配足够的空间、设置多个文件、避免长事务的使用、避免频繁创建和删除临时对象、以及防止系统对象缓存的不正常释放。