第23/24周 临时数据库(TempDb)

在今天的性能调优培训里咱们讨论下TempDb——SQL Server的公共厕所,在SQL Server里我是这样描述它的。咱们的每一个人都会常常使用TempDb。有些人直接使用它,有些人不直接使用它。今天我想给你归纳介绍下SQL Server里TempDb的用法,另外我会给你为了更好的性能,如何配置TempDb的一些最佳实践。html

TempDb用法

咱们的每一个人使用TempDb。这是咱们要接受的事实。所以按需配置TempDb很是重要——即为了得到良好的性能。TempDb存储下列3类对象:算法

  • 用户对象(User Objects
  • 内部对象(Internal Objects
  • 版本存储(Version Store

咱们来详细看下这些对象。当咱们讨论用户对象时,咱们指的是临时表,表变量和表值函数。在SQL Server里临时表有2种:本地临时表,全局临时表。本地临时表使用“#”前缀建立,只局限于建立它的会话。一旦你关闭你的会话,本地临时表也会在TempDb里消失。本地临时表的好处:使用它们,你能够克服锁和阻塞问题,由于每一个会话都拥有它本身的,专用的临时表。数据库

在SQL Server里还有全局临时表,它用“##”前缀建立。这些临时表在全部会话里均可以访问,由于它是全局建立的。最后,SQL Server为你提供表变量,它在TempDb里也是物理持久的,但局限于你定义表变量的批处理里。表变量是SQL Server里的内存中结构是个误解。它们在TempDb里老是持久的。从表值函数返回的表在TempDb里也是持久的。所以当在SQL Server里使用这些对象,按需配置它们很是重要。并发

包括做为开发人员或DBA的你在内——SQL Server自己也总为内部建立对象存储使用TempDb。当你使用DBCC CHECKDBDBCC CHECKTABLE运行一致性检查时,SQL Server在TempDb里分配工做表,执行计划里的排序或者哈希操做也会蔓延到TempDb,这些在TempDb里也都是物理持久的。当你使用游标时,甚至Service Broker,你在消耗TempDb里的空间。若是你用SORT_IN_TEMPDB选项重建索引,你也在使用TempDb。在SQL Server里TempDb在每一个地方都会用到。函数

另外对于内部对象,SQL Server也支持所谓的版本存储(Version Store),在SQL Server里当你使用乐观并发控制(optimistic concurrency)时或进行在线索引操做时会用到。内部SQL Server分版本存储为2个不一样的存储:对于触发器(triggers),快照隔离(Snapshot Isolation),提交读快照隔离(Read Committed Snapshot Isolation),还有多数据结果集(Multiple Active Result Sets (MARS)),使用通用版本存储(Common Version Store)。在SQL Server里在线索引重建版本存储(Online Index Rebuild Version Store)被在线索引操做使用。性能

TempDB配置

在默认配置里运行TempDb并真是个好想法。TempDb的默认配置只给你一个数据文件和一个事务日志文件。在SQL Server 2014里,数据文件初始大小有8M,对于事务日志是1M。2个文件都设置为10%的自动增加。这个配置会带来几个问题:ui

  • 太多超时的自动增加操做
  • 日志文件碎片
  • 闩锁竞争(Latch contention)

咱们来详细看下这些问题。使用默认的8M的初始大小,你的TempDb使用昂贵的自动增加操做会有超时增加。若是你知道你的TempDb在大小上须要必定的MB,你须要把它设置为初始大小,由于在SQL Server启动期间,TempDb总从model数据里从新建立。那个方式你能够避免自动增加操做。若是你依赖于自动增加设置,你也应该使用固定大小,而不是百分比值。这也容许你估计自动增加操做须要花费的时间。使用百分比值,基于当前你的文件大小会花费愈来愈长的时间。spa

你也须要仔细TempDd的事务日志的大小,由于那里自动增加操做是很是昂贵的。对于任何事务日志, SQL Server不能使用即时文件初始化(Instant File Initialization)。这意味着在事务日志的自动增加期间,你的数据库不能访问事务。对于性能关键系统,在事务日志上的自动增加操做基本是不可行的。日志

最后你也会碰到TempDb里的闩锁竞争问题,由于只有一个数据文件可用。当SQL Server在TempDb里分配新对象时,SQL Server须要读取特定页(SGAM,GAMPFS)。这些页在去写期间必须被竞争。当你运行高度依赖于TempDB的工做时,在TempDb里这些热页上会有竞争问题。htm

这个问题的解决方法是对于TempDb使用多个数据文件,由于那时SQL Server会经过多个数据文件使用循环分配算法(Round-Robin allocation algorithm),它会减小闩锁竞争问题。若是你使用多个数据文件,你也须要确保初始大小(一个可能的自动增加值)设置为同样的值,这样的话它们会同时增加。

小结

在今天的性能调优培训里咱们讨论了SQL Server里的特定数据库——TempDb。如你所见,在SQL Server里每一个人总会使用TempDb——直接或间接。所以按需调整和计划TempDb很是重要。在第2部分咱们给你一些如何配置TempDb的建议。一星期后你会收到性能调优培训的最后一周,我会谈下数据库维护,同时祝你这周玩得开心! 

相关文章
相关标签/搜索