第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周 ...
随机推荐
- noty – jQuery通知插件
noty是一个jQuery的通知(信息提示)插件,灵活轻便,是一个非常棒的用于替代传统提示对话框的插件. 当前最新版本为2.1.0: 从https://github.com/needim/noty 可 ...
- 我的ORM之十-- MyOql实现原理
我的ORM索引 ORM的功能 两个基本功能 翻译:对象查询转化为SQL 映射:把查询结果转化为实体 更多功能 如果仅仅实现这两个功能,那这两个是可以独立的,实现起来也就很简单了.但MyOql的目标还有 ...
- 【转】Backbone标准例子——通讯录
参考:http://z2009zxiaolong.iteye.com/blog/1847833 感觉不错的例子,模型.视图.路由等知识点都用到了:),将此文中的源码转载如下: http://dmyz. ...
- AMD加载器实现笔记(四)
继续这一系列的内容,到目前为止除了AMD规范中config的map.config参数外,我们已经全部支持其他属性了.这一篇文章中,我们来为增加对map的支持.同样问题,想要增加map的支持首先要知道m ...
- [nRF51822] 4、 图解nRF51 SDK中的Schedule handling library 和Timer library
:nRF51822虽然是一个小型的单片机,但是能真正达到任意调用其官方驱动以及BLE协议栈的人还是奇缺的.据我所见,大都拿官方给的一个冗长的蓝牙低功耗心率计工程改的.之前我对于这个工程进行log跟踪, ...
- java内存管理总结
编译好的java程序需要运行在jvm中. 程序,无论是代码还是数据,都需要存储在内存中.JVM为java提供并管理所需要的内存空间. JVM内存分为堆.栈.方法区. 对象存储在堆中. This liv ...
- select2初始化默认值
之前用select2初始化默认值使用了select2('val','1'),这样做没问题,但只能用在单选上,多选的话,即使将val后面的值改成数组['0', '2']这种形式也没用. <scri ...
- loglikelihood ratio 相似度
摘要: 在机器学习中常用到各种距离或者相似度,今天在看美团推荐系统重排序的文章时看到了loglikelihood ratio 相似度,特总结起来.以后有时间再把常用的相似度或者距离梳理到一篇文章. 背 ...
- Fedora 24 install MySQL
Background I have work with mysql on the fedora OS, but currently fedora have no support mysql inste ...
- JS生成1000个数字加字母的不重复的随机字符串
周五,快下班了,正收拾东西准备走人,项目经理突然让我给他做个Excel,1000个数字加字母组合的密码,不重复,下班前给. 我直接懵了,Excel不会,估计是要写个什么命令才能生成出来,于是想着有没有 ...