Tempdb怎么会成为性能瓶颈
转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/25/tempdb.aspx
我曾经遇到过这样一个性能问题。一个客户反映,他的SQL Server会在某一段时间里,突然变得非常慢。最后他不得不重启SQL Server服务。而重启以后,问题就消失了。客户在出现问题的那段时间里,收集了主要的系统动态管理视图,以及性能监视器里和SQL Server有关的那些计数器。顺便说一句,这台服务器有16颗CPU。
Sys.dm_exec_requests是检查SQL Server性能瓶颈的有力工具。在处理SQL Server性能问题的时候,它是作者第二个检查的对象。(第一个当然是SQL Server的日志文件,要确认Server当时没有异常。)
从Sys.dm_exec_requests的结果看,问题比较明显,有很多任务在争抢页面2:18:331608上的PAGELATCH_x资源。Tempdb上的瓶颈是当时最大的问题。
Tempdb上的一个页面,能造成客户整个SQL Server响应缓慢。这是为什么?为什么重起又能解决问题呢?
Tempdb是SQL Server里的一个重要的系统数据库。许多用户的操作,都有可能使用到它。最常见的当然是用户使用临时表或者表变量。其他可能性有,用户使用trigger,Snapshot Isolation Level,某些复杂的查询,DBCC CHECKDB,以及DBCC Reindex等。
当数据库创建一张新表的时候,SQL Server要为这张表分配存储页面,同时SQL Server也要修改SGAM, PFS,和GAM页面,把已经分配出去的页面标志成已使用。所以每创建一张新表,SGAM, PFS, 和GAM这些系统页面都会有修改动作。
这种行为对一般的用户数据库不会有问题,因为正常的应用不会折腾着不停地建表、删表。但是tempdb就不同了。如果一个存储过程使用了临时表,而这个存储过程被并发用户广泛使用,那很自然地就会有很多并发用户在tempdb里同时创建表,做完了以后又删除表。这样,在一个时间点,会有很多任务要修改SGAM, PFS,或GAM页面。但是为了维护物理的一致性,对于同一个页面,SQL Server在一个时间点同时只允许一个用户修改它。所以对于tempdb,如果同时有很多很多人要在同一个数据文件里分配空间,那这个数据文件的SGAM,
PFS, 或GAM页面,就有可能成为系统瓶颈。大家只能一个一个做,并发度上不去。
但是2:18:331608这个值让人有点疑惑。第一,文件ID 18意味着这个tempdb上至少有18个文件。除去一个日志文件,这个tempdb至少有17个数据文件。而这台服务器只有16颗CPU,为什么大家别的数据文件都不用,非要抢这个第18号文件呢?这是很奇怪的地方。第二,SGAM, PFS, 和GAM页面都在文件的开头。只有当数据文件变得比较大以后,文件头的那几个页面已经不够用了,SQL Server才会在后面再分配新的系统页面。所以331608意味着这个18号文件当时已经比较大了。
带着这些疑惑,作者又让客户收集了一个tempdb上的sp_helpfile结果。这个结果回答了疑惑。
像前面猜测的一样,这个tempdb上果然有17个数据文件。但是这些文件的配置是不一样的。前16个文件的初始大小是256MB,最大大小是512MB。而最后一个数据文件,也就是出问题的18号,初始大小是2GB,没有上限。用户这样设置,显然是为了防止tempdb在P盘上使用太多的空间。
如果tempdb能够同时使用这17个数据文件,那么它会同时在不同的数据文件里为不同的用户分配空间。也就意味着,同时可以有多个人创建临时对象。这样Tempdb就不再会是系统的性能瓶颈。并发度会大大提高。
那这位用户那里发生了什么呢?通过性能监视器的计数器SQLServer:Databases – Data File(s) Size (KB),发现当时Tempdb的总大小在21GB。也就是说,前面的16个小的数据文件已经用满。SQL Server只好集中使用第18号数据文件,因为它没有上限,就让它不断自动增长。所有的压力都集中在了一个文件上,难怪这个文件成为了瓶颈。
SQL Server重起以后,Tempdb被清空。��户重新可以同时使用这17个文件。所以,重起解决了问题。
为了达到长治久安,在高并发、又大量使用Tempdb的SQL Server里,DBA需要这样配置Tempdb。
1. 创建和CPU数目同样多的Tempdb数据文件,每个文件的大小要一样大。
这里客户应该创建16个数据库文件,每个2GB,差不多够用。
2. 严密监视Tempdb空间使用情况,确保这些文件不会被SQL Server写满。
3. 如果使用中发现初始空间不够大,需要手工增长每一个数据文件,确保它们始终一样大。
如果初始空间不够大,SQL Server会自动增长某个文件,获得新的空间。而这个自动增长的文件会成为系统瓶颈。所以不能依赖SQL Server帮你自动增长。
当然,监视tempdb的使用情况,搞清楚是谁在tempdb里占用了这么多空间也是很重要的。我们会另有文章,介绍怎么监视tempdb的使用情况。
Tempdb怎么会成为性能瓶颈的更多相关文章
- [转]如何监测谁用了SQL Server的Tempdb空间
Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用.在现在的SQL Server里,其使用频率可能会超过用户的想象.如果Tempdb空间耗尽,许多操作将不能完成 ...
- sql server 性能调优之 资源等待PAGELATCH
一.概述 在前几章介绍过 sql server 性能调优资源等待之PAGEIOLATCH,PAGEIOLATCH是出现在sql server要和磁盘作交互的时候,所以加个IO两个字.这次来介绍PAGE ...
- 【转】怎样查出SQLServer的性能瓶颈
怎样查出SQLServer的性能瓶颈 --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url]--原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到SQ ...
- SQL Server 利用游标解决Tempdb究极竞争-DBA-程序员需知
SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点 ...
- 怎样查出SQLServer的性能瓶颈
怎样查出SQLServer的性能瓶颈 --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url]--原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到SQ ...
- Sql Server tempdb原理-启动过程解析实践
我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...
- 数据库实战案例—————记一次TempDB暴增的问题排查
前言 很多时候数据库的TempDB.日志等文件的暴增可能导致磁盘空间被占满,如果日常配置不到位,往往会导致数据库故障,业务被迫中断. 这种文件暴增很难排查,经验不足的一些运维人员可能更是无法排查具体原 ...
- DOM性能瓶颈与Javascript性能优化
这两天比较闲,写了两篇关于JS性能缺陷与解决方案的文章(<JS特性性能缺陷及JIT的解决方案>,<Javascript垃圾回收浅析>),主要描述了untyped,GC带来的问题 ...
- Tempdb initial size和dbcc shrinkfile
在使用sql server时您可能遇到过下面的情况,tempdb的数据文件初始大小为3mb, 随着对tempdb的使用,tempdb文件逐渐变得很大(例如30GB),导致了磁盘空间不足. 此时您需要立 ...
随机推荐
- MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
首先,我们创建一个逗号分隔字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR ...
- MySQL数据转移至MSSQL详解
一.安装MySQL ODBC驱动 为MySQL安装Connector/ODBC驱动.在此需要注意的一点是Connector/ODBC驱动与MySQL Server的版本对应问题. 二.创建系统DS ...
- ssh 实体关系分析确立(ER图-实体关系图)
比較简单的方式就是依据模仿同类产品,依据同类产品的进行模仿,表单就是一个起码要加的字段,然后依据项目须要额外添加字段. 注意:实体类之间的引用关系还须要考虑性能的影响.如:单向或是双向. 表设计: 设 ...
- Windows Phone开发(2):竖立自信,初试锋茫
原文:Windows Phone开发(2):竖立自信,初试锋茫 上一篇文章中,我们聊了一些"大炮"话题,从这篇文章开始,我们一起来学习WP开发吧. 一.我们有哪些装备. 安装完VS ...
- Linux如何用QQ?Linux下QQ使用的几种方案
在linux下如何使用QQ?在ubuntu11.10中如何使用QQ?或许有初涉linux的人这样问,我们可以看看ubuntusoft总结出来的几种在linux系统下用QQ的方法.前面的几种主要的方法都 ...
- python进阶八_警告和异常
心情有点纠结,怎么说呢,倒不是由于其它学习上的事情,反而是由于生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是由于交流不够,彼此不够了解吧,希望能尽快度过这一段纠结的日子,简单 ...
- IOS_多线程_ASI_AFN_UIWebView
H:/0730/00_多线程4票种_ViewController.h // // ViewController.h // 卖票 // // Created by apple on 13-7-29. / ...
- windows azure Vm、cloud service、web application 如何选择可用的服务
windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...
- Linux 下开启ssh服务(转)
二.SSH SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目 ...
- 使用邮件发送执行时间久的SQL语句
ALTER proc [dbo].[usp_EmailLongRunningSQL] as begin declare@LongRunningQueries AS TABLE ( lrqId int ...