Sql Server TEMPDB 设计


         tempdb 和sql server 用户数据库一样都是通过model系统 数据库模板克隆创建而来,是全局资源供所有连接到sql server实例上的用户使用,不同的是tempdb 每次sql server 实例重启都会删除、重新创建初始化,主要存储以下2类对象:

  用户临时对象:用户创建的全局/本地临时表、表变量、表值函数、游标、临时存储过程;

  系统临时对象: create index时(指定sort_in_tempdb选项)的中间排序数据、快照隔离级别时的行版本信息、用于

                         哈希联接或哈希聚合操作的工作文件、order by/group by/union 中间排序数据

     由于sql server 临时对象结构没有持久化,在高并发系统频繁的创建、销毁临时对象可能会导致tempdb page latch 争用影响数据库性能,以下是一些准对高并发数据库系统tempdb 设计方式、思路:

   tempdb 设计(优化tempdb page latch)

   1、数据文件数取决于计算机上的(逻辑)处理器数。 一般而言,如果逻辑处理器数目小于或等于 8,则使用的数据文件数与逻辑处理器数相同。 如果逻辑处理器数大于 8,请指定 8 个数据文件。 如果仍然存在争用,则以 4 的倍数增加数据文件的数量,直到争用减少到可接受的级别或对工作负荷/代码进行更改,文件增长应按照大小而不是默认的百分比来增长,每个数据文件的初始大小以及增长大小保持相同。(此为sql server 2016 以及以上版本tempdb的默认行为)

   2、数据文件应放置在io 性能很好的磁盘上并预留足够的空间并做好空间监控。

   3、如果是sql server 2019 以及以上版本,可以通过开启In memory tempdb metadata来基本消除 page latch 争用。

       ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA=ON;

   4、通过开启追踪标志1117、1118 来优化数据文件增长、页面空间分配方式。

       sql server 2016 之前:

       DBCC TRACEON (1117, -1)

       DBCC TRACEON (1118, -1)

       sql server 2016以及以上:

        ALTER DATABASE [tempdb]
         MODIFY FILEGROUP [FileGroup_Name] AUTOGROW_ALL_FILES;(默认增长单个数据文件)

        ALTER DATABASE [tempdb]
         SET MIXED_PAGE_ALLOCATION OFF;(对于tempdb 以及新建的用户数据库默认不使用混合区分配空间)