在今天的性能调优培训里我们讨论下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 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%的自动增长。这个配置会带来几个问题:

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

我们来详细看下这些问题。使用默认的8M的初始大小,你的TempDb使用昂贵的自动增长操作会有超时增长。如果你知道你的TempDb在大小上需要一定的MB,你需要把它设置为初始大小,因为在SQL Server启动期间,TempDb总从model数据里重新创建。那个方式你可以避免自动增长操作。如果你依赖于自动增长设置,你也应该使用固定大小,而不是百分比值。这也允许你估计自动增长操作需要花费的时间。使用百分比值,基于当前你的文件大小会花费越来越长的时间。

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

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

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

小结

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

第23/24周 临时数据库(TempDb)的更多相关文章

  1. SQL SERVER 临时数据库 tempdb 迁移或增加文件

    临时数据库TempDB 虽然是临时库,但对整个数据库系统性能却起到很关键的作用:平时用到的中间数据集会暂时保存到TempDB 中,比如:临时表,排序,临时统计信息,一些中间结果数据,索引重建 等.我们 ...

  2. 第0/24周 SQL Server 性能调优培训引言

    大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...

  3. react-native SyntaxError xxxxx/xx.js:Unexpected token (23:24)

    在运行react-native项目时提示 SyntaxError xxxxx/xx.js:Unexpected token (23:24) 我这边的问题原因:jsx语法错误,解决办法就是认真排查代码然 ...

  4. [SQL_Server_Question]Msg 1105无法为数据库 'tempdb' 中的对象分配空间,因为 'PRIMARY' 文件组已满

    错误消息: Msg 1105, Level 17, State 2, Line 266Could not allocate space for object 'dbo.Large Object Sto ...

  5. JavaSE_ 多线程 总目录(23~24)

    JavaSE学习总结第23天_多线程123.01 多线程程序的引入23.02 进程概述及多进程的意义23.03 线程概述及多线程的意义23.04 并行和并发的区别23.05 Java程序运行原理和JV ...

  6. 分享Kali Linux 2017年第24周镜像文件

     分享Kali Linux 2017年第24周镜像文件  Kali Linux官方于6月11日发布2017年的第24周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KD ...

  7. 无法为数据库 'tempdb' 中的对象分配空间,因为 'PRIMARY' 文件组已满

    错误描述 消息 1105,级别 17,状态 2,第 1 行无 法为数据库 'tempdb' 中的对象 'dbo.SORT temporary run storage:  140737503494144 ...

  8. SQLServer 维护脚本分享(08)临时数据库(tempdb)

    dbcc sqlperf(logspace) --各数据库日志大小及使用百分比 dbcc loginfo --查看当前数据库的虚拟日志文件 --临时表'Tempdb'最近使用情况 SELECT t1. ...

  9. 第3/24周 区_SQL Server中管理空间的基本单位

    哇哦,SQL Server性能调优培训已经进入第3周了!同时你已经对SQL Server内核运行机制有了很好的认识.今天我会讲下SQL Server中的区管理,因为这是个很重要的话题,我们会在第23周 ...

随机推荐

  1. [leetcode 27]Implement strStr()

    1 题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...

  2. JSON数据查询方法

    在进行前端项目开发的时候时长会遇到JSON的数据查找问题,如何方便快速查找?这里推荐一个linqjs组件,项目主页参见http://linqjs.codeplex.com/ 查询对象 var json ...

  3. .net开发笔记(十六) 对前部分文章的一些补充和总结

    补充有两个: 一个是系列(五)中讲到的事件编程(网址链接),该文提及到了事件编程的几种方式以及容易引起的一些异常,本文补充“多线程事件编程”这一块. 第二个是前三篇博客中提及到的“泵”结构在编程中的应 ...

  4. Word发布博客测试

    /// <summary> /// Main相当于Windows服务的Start方法 主要负责初始化的工作 /// </summary> /// <param name= ...

  5. Java框架搭建-Maven、Mybatis、Spring MVC整合搭建

    1. 下载eclipse 到网站下载 http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/marsr 选择 ...

  6. 每天一个linux命令(58):telnet命令

    telnet命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户 ...

  7. Redis主从复制问题和扩容问题的解决思路

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/106.html?1455867541 一.解决主从复制问题 当使用Redi ...

  8. Redis数据库的使用场景介绍(避免误用Redis)

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/122.html?1455854235 Redis 是目前 NoSQL 领域 ...

  9. Thrift架构~动态Thrift插件的注入

    先说AOP 说到注入,大家就会想起来IoC和AOP,确实如些,这一讲中,我们通过unity来实现对thrift插件的动态注入,事实上,这个功能在以后的项目中经常要用到,比如,你将一些功能分发到指定服务 ...

  10. Java程序员的日常 —— 多进程开发IO阻塞问题

    本篇仍旧是源于最近的工作,总结一下纪念那些年埋下的坑... 背景故事 需求:"使用进程方式启动另一个程序!" 开发:"OK! Runtime.getRuntime().e ...