第23/24周 临时数据库(TempDb)
在今天的性能调优培训里我们讨论下TempDb——SQL Server的公共厕所,在SQL Server里我是这样描述它的。我们的每个人都会经常使用TempDb。有些人直接使用它,有些人不直接使用它。今天我想给你概括介绍下SQL Server里TempDb的用法,另外我会给你为了更好的性能,如何配置TempDb的一些最佳实践。
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 CHECKDB或DBCC 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%的自动增长。这个配置会带来几个问题:
- 太多超时的自动增长操作
- 日志文件碎片
- 闩锁竞争(Latch contention)
我们来详细看下这些问题。使用默认的8M的初始大小,你的TempDb使用昂贵的自动增长操作会有超时增长。如果你知道你的TempDb在大小上需要一定的MB,你需要把它设置为初始大小,因为在SQL Server启动期间,TempDb总从model数据里重新创建。那个方式你可以避免自动增长操作。如果你依赖于自动增长设置,你也应该使用固定大小,而不是百分比值。这也允许你估计自动增长操作需要花费的时间。使用百分比值,基于当前你的文件大小会花费越来越长的时间。
你也需要仔细TempDd的事务日志的大小,因为那里自动增长操作是非常昂贵的。对于任何事务日志, SQL Server不能使用即时文件初始化(Instant File Initialization)。这意味着在事务日志的自动增长期间,你的数据库不能访问事务。对于性能关键系统,在事务日志上的自动增长操作基本是不可行的。
最后你也会碰到TempDb里的闩锁竞争问题,因为只有一个数据文件可用。当SQL Server在TempDb里分配新对象时,SQL Server需要读取特定页(SGAM,GAM,PFS)。这些页在去写期间必须被竞争。当你运行高度依赖于TempDB的工作时,在TempDb里这些热页上会有竞争问题。
这个问题的解决方法是对于TempDb使用多个数据文件,因为那时SQL Server会通过多个数据文件使用循环分配算法(Round-Robin allocation algorithm),它会减少闩锁竞争问题。如果你使用多个数据文件,你也需要确保初始大小(一个可能的自动增长值)设置为一样的值,这样的话它们会同时增长。
小结
在今天的性能调优培训里我们讨论了SQL Server里的特定数据库——TempDb。如你所见,在SQL Server里每个人总会使用TempDb——直接或间接。因此按需调整和计划TempDb非常重要。在第2部分我们给你一些如何配置TempDb的建议。一星期后你会收到性能调优培训的最后一周,我会谈下数据库维护,同时祝你这周玩得开心!
第23/24周 临时数据库(TempDb)的更多相关文章
- SQL SERVER 临时数据库 tempdb 迁移或增加文件
临时数据库TempDB 虽然是临时库,但对整个数据库系统性能却起到很关键的作用:平时用到的中间数据集会暂时保存到TempDB 中,比如:临时表,排序,临时统计信息,一些中间结果数据,索引重建 等.我们 ...
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- react-native SyntaxError xxxxx/xx.js:Unexpected token (23:24)
在运行react-native项目时提示 SyntaxError xxxxx/xx.js:Unexpected token (23:24) 我这边的问题原因:jsx语法错误,解决办法就是认真排查代码然 ...
- [SQL_Server_Question]Msg 1105无法为数据库 'tempdb' 中的对象分配空间,因为 'PRIMARY' 文件组已满
错误消息: Msg 1105, Level 17, State 2, Line 266Could not allocate space for object 'dbo.Large Object Sto ...
- JavaSE_ 多线程 总目录(23~24)
JavaSE学习总结第23天_多线程123.01 多线程程序的引入23.02 进程概述及多进程的意义23.03 线程概述及多线程的意义23.04 并行和并发的区别23.05 Java程序运行原理和JV ...
- 分享Kali Linux 2017年第24周镜像文件
分享Kali Linux 2017年第24周镜像文件 Kali Linux官方于6月11日发布2017年的第24周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KD ...
- 无法为数据库 'tempdb' 中的对象分配空间,因为 'PRIMARY' 文件组已满
错误描述 消息 1105,级别 17,状态 2,第 1 行无 法为数据库 'tempdb' 中的对象 'dbo.SORT temporary run storage: 140737503494144 ...
- SQLServer 维护脚本分享(08)临时数据库(tempdb)
dbcc sqlperf(logspace) --各数据库日志大小及使用百分比 dbcc loginfo --查看当前数据库的虚拟日志文件 --临时表'Tempdb'最近使用情况 SELECT t1. ...
- 第3/24周 区_SQL Server中管理空间的基本单位
哇哦,SQL Server性能调优培训已经进入第3周了!同时你已经对SQL Server内核运行机制有了很好的认识.今天我会讲下SQL Server中的区管理,因为这是个很重要的话题,我们会在第23周 ...
随机推荐
- sqlserver各备份解释
1)完全备份 ------------------------------------------- (1)是备份的基准.在做备份时第一次备份都建议使用完全备份. (2)完全备份会备份数据库的所有数据 ...
- 不写1行代码,在Mac上体验ASP.NET 5的最简单方法
昨天微软发布了ASP.NET 5 beta2(详见ASP.NET 5 Beta2 发布),对ASP.NET 5的好奇心又被激发了. 今天下午在Mac OS X上体验了一下ASP.NET 5,而且借助Y ...
- 用JQ仿造礼德财富网的图片查看器
现在就职于一家P2P平台,自然也会关注同行其它网站的前端技术,今天要仿造的是礼德内页的一个图片查看器效果.不过说白了,无论人人贷也好礼德财富也好,很多地方的前端都做的不尽如人意,比如忽略细节.缺乏交互 ...
- java提高篇(二三)-----HashMap
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- FusionCharts简单教程(二)-----使用js加载图像和setDataXML()加载数据
前面一篇对FusionCharts进行了一个简单的介绍,而且建立了我们第一个图形,但是那个是在HTML中使用<OBJECT>和<EMBED>标记来加载图形的,但是这 ...
- http学习笔记(二)—— 嘿!伙计,你在哪?(URL)
我们之所以希望浏览网页,其中一个重要的原因就是庞大的web世界中有很丰富的资源,他就像哆啦a梦的口袋,随时都能拿出我们想要的宝贝.这些资源通过http被传送到我们的浏览器,并展示到我们的屏幕上.而我们 ...
- C#实现的等额本息法、按月付息到期还本法、一次性还本付息法
你若懂行,那便有用,如下: void Main(){ var x = DengEBenXi.Compute(11111, 12, 3); x.Dump(); var y = AnYu ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 【重要更新】Senparc.Weixin.Open v1.5.1
本次更新调整了命名空间和文件位置,具体变化为(可以直接在源代码中替换): 旧命名空间(对应文件夹) 新命名空间(对应文件夹) Senparc.Weixin.Open.OAuth Senparc.Wei ...
- fir.im Weekly - 2015 年开发者调查报告
终于一脚迈入了 2016 年.无论你是否准备好,未来已经汹涌扑来-- 新年第一期的 fir.im Weekly 干货颇多,来看一看:) 2015 Developer Survey stackoverf ...