步骤1.TempDB压力诊断

等待类型诊断

TempDB的争用压力在等待篇中已经简单介绍,等待的表现为 pagelatch_类等待,等待的资源是 “2: X :X ”

tempDB所在磁盘的响应时间

一个实例下只有一个tempdb,也就是当你在一个实例下创建了100个数据库,这100个数据库也只能用这一个TempDB。

你创建的临时表,或SQL执行语句所需要的排序等操作都需要用到Tempdb。所以TempDB对磁盘的响应时间要求比较高。

步骤2.解决问题

把TempDB设置成多个来分摊这个压力。

分成多个文件

    作为一般规则,如果逻辑处理器数小于或等于 8,使用和逻辑处理器相同数量的数据文件。如果逻辑处理器数大于 8 时,使用 8 个数据文件,然后如果仍然存在争用,增加数据文件数4 的倍数(最多的逻辑处理器数)直到争用降低到可接受的程度或对工作负荷/代码进行更改。

文件大小、增长率要相同

   这里需要注意一个小细节,你所分配的文件必须大小一致,如果设置自动增长那么增长率要相同

    

 

TempDB磁盘划分

    大多数情况下,TempDB的文件不需要拆分磁盘,在同一个磁盘即可,如果压力大可以选择放置在一个单独的磁盘中,这样不会与其他文件(如数据读写)发生磁盘资源竞争。

    

    如果出现TempDB 读取响应时间高的情况,请考虑,TempDB的磁盘相关优化,如将TempDB文件单独放入比较快的磁盘。

 
步骤3.语句调优

  语句调优篇提到语句中使用临时表或表变等会减少语句的复杂度,提升语句的效率,是常用的三板斧之一,但这里的需要一个平衡。如果对语句过度使用会造成文中提到的TempDB压力。那么怎么样平衡呢?下面给出几点建议:

  1. 切记不要过度使用临时表!临时表的使用主要有两个场景,拆分语句降低复杂性。另一个是缓存中间结果避免重复操作。
  2. 减少使用临时表锁系统表的时间!”select 字段 into #临时表 from“ 如果语句执行时间过长这将是灾难,尽量选用先创建,后插入的做法。
 
 
 

原理:TempDB压力从哪来?

    当数据库创建一张新表的时候,SQL Server要为这张表分配存储页面,同时SQL Server也要修改SGAM, PFS, 和GAM页面,把已经分配出去的页面标志成已使用。所以每创建一张新表,SGAM, PFS, 和GAM这些系统页面都会有修改动作。这种行为对一般的用户数据库不会有问题,因为正常的应用不会折腾着不停地建表、删表。但是tempdb就不同了。如果一个存储过程使用了临时表,而这个存储过程被并发用户广泛使用,那很自然地就会有很多并发用户在tempdb里同时创建表,做完了以后又删除表。这样,在一个时间点,会有很多任务要修改SGAM, PFS, 或GAM页面。但是为了维护物理的一致性,对于同一个页面,SQL Server在一个时间点同时只允许一个用户修改它。所以对于tempdb,如果同时有很多很多人要在同一个数据文件里分配空间,那这个数据文件的SGAM, PFS, 或GAM页面,就有可能成为系统瓶颈。大家只能一个一个做,并发度上不去。

    这就好像你进停车场要登记交费一样!一个一个来不要急~

    

    等待资源为 : “2:1:3” 这是什么意思? ID 为 2 的数据库(TempDB)的 1号文件 的 页码为3的页(SGAM页面)!

    

    这里关于系统页不过多的介绍,想详细了解的朋友请参见 :  SQL Server中的GAM页和SGAM页

我创建个临时表跟系统页还有关系?

    下面也用一个例子说明 :

    创建临时表的时候会对系统表中进行插入和更新,而删除临时表逆向过程会删除或更新系统表!

 
use [AdventureWorks2012]
GO
checkpoint
go
create table #t
(
id int
)
drop table #t use tempdb
go
select Operation,CONTEXT,[Transaction ID],AllocUnitId,AllocUnitName,[Page ID],[Transaction Name],Description from fn_dblog(null,null)
 

    

    

    所以当你并发过高且频繁创建删除临时表的时候就会造成大量的争用。

 

TempDB问题定位与解决的更多相关文章

  1. centos7.5离线安装Docker及容器运行报OCI runtime create failed 问题定位与解决

    前言 接上篇 <记一次centos挂载ceph存储的坑> 服务器重做了centos7.5版本的操作系统,剩下就是安装docker,考虑yum安装耗时较长,我一般都是直接安装二进制版本doc ...

  2. (高德地图)marker定位 bug 解决总结

    项目背景: 一个项目bug,项目中用到高德地图,默认打开页面会生成一个marker(下图红色icon),然后用户拖动marker到想要的位置,并且保存. 用户反映定位不准确,在当前页面编辑的位置,到后 ...

  3. "The request sent by the client was syntactically incorrect ()"问题定位及解决:

    Spring MVC "The request sent by the client was syntactically incorrect ()"解决办法: 把spring日志级 ...

  4. SQL SERVER——CPU问题定位与解决

        CPU问题定位基本流程: 性能计数器诊断 主要用到的性能计数器 %Process Time 全实例 (主要用于查看当前服务器的CPU 情况) %Process Time sqlservr (主 ...

  5. xcode8 使用Instruments检测定位并解决iOS内存泄露

    https://www.jianshu.com/p/9bc7e65fc247 2017.07.27 17:24* 字数 628 阅读 1319评论 6喜欢 21 简介: 虽然苹果出了ARC(自动内存管 ...

  6. linux磁盘空间占满问题快速定位并解决

    经常会遇到这样的场景:测试环境磁盘跑满了,导致系统不能正常运行!此时就需要查看是哪个目录或者文件占用了空间.常使用如下几个命令进行排查:df, lsof,du. 通常的解决步骤如下:1. df -h ...

  7. appium===浮窗无法定位的解决办法

    这个问题比较常见,而且不被重视.大多数人的解决思路是根据坐标,把它点掉. 如下图,根本无法定位出“你好”这个元素: 最后的解决办法是: 在desired_caps={}中增加, desired_cap ...

  8. HTTP错误状态码定位与解决

    实践总结 本次基于对500错误定位为例,给大家讲解整个分析过程与解决方法. 1.本次实践为HTTP错误状态码定位提供一个高效.精确的定位方式,不仅仅局限于500错误. 2.针对500错误本身,可以基于 ...

  9. CPU问题定位与解决

    CPU问题定位基本流程:   性能计数器诊断 主要用到的性能计数器 %Process Time 全实例 (主要用于查看当前服务器的CPU 情况) %Process Time sqlservr (主要用 ...

随机推荐

  1. window下Git和github入门

    tip:使用简单的例子来制作一个使用指南过程,默认文件夹为demo.看了3个早晨,写一下留个记录,可能有些不成熟,如有错误欢迎指正. 参考一:http://www.liaoxuefeng.com/wi ...

  2. Outlook 2013 电子邮件账户设置备份与恢复

    与之前版本不同,Outlook 2013需要备份以下注册表内容:HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Profiles恢复时 ...

  3. 关于js中window.location.href,location.href,parent.location.href,top.location.href用法

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  4. ASP.NET MVC TempData使用心得

    说明: 在ASP.NET MVC中資料傳遞主要有ViewData與TempData ViewData主要是Controller傳遞Data給View,存留期只有一個Action,要跨Action要使用 ...

  5. 用JS的数组缓存一些东西

    var cache_index = new Array(); //首页的ajax缓存 //ajax 推荐的游戏和软件 function change_tuijian(sid,div_class){ i ...

  6. EXP/IMP 命令参数

    http://www.cnblogs.com/sopost/archive/2010/01/19/2190125.html 1.EXP:            1.完全:          EXP  ...

  7. 关于在官网上下载Eclipse遇到的问题!!

    首先Eclipse是什么? Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境. 幸运的是,Eclipse 附带了一 ...

  8. Python实现字典的key和values的交换

    #encoding=utf-8 #反转字典 即key和val互换 dict1={1:2,3:4,6:7,9:10} print '---生成器表达式' def invert_dict(d): retu ...

  9. 不常见但很有用的chrome调试工具使用方法

    前面的话   对于chrome调试工具,常用的是elements标签.console标签.sources标签和network标签.但实际上,还有一些不太常见但相当实用的方法可以提高网页调试效率.本文将 ...

  10. ArcGIS API for JavaScript 4.2学习笔记[5] 官方API大章节概述与内容转译

    内容如上,截图自ESRI官网,连接:ArcGIS API for JavaScript 4.2 [Get Started] 类似于绪论一样的东西,抽取了最需要关注的几个例子.如:加载Map和View, ...