【T-SQL性能优化】01.TempDB的使用和性能问题

以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。

本系列【T-SQL基础】主要是针对T-SQL基础的总结。

【T-SQL基础】01.单表查询-几道sql查询题

【T-SQL基础】02.联接查询

【T-SQL基础】03.子查询

【T-SQL基础】04.表表达式-上篇

【T-SQL基础】04.表表达式-下篇

【T-SQL基础】05.集合运算

【T-SQL基础】06.透视、逆透视、分组集

【T-SQL基础】07.数据修改

【T-SQL基础】08.事务和并发

【T-SQL基础】09.可编程对象

----------------------------------------------------------

【T-SQL进阶】01.好用的SQL TVP~~独家赠送[增-删-改-查]的例子

----------------------------------------------------------

【T-SQL性能调优】01.TempDB的使用和性能问题

【T-SQL性能调优】02.Transaction Log的使用和性能问题

【T-SQL性能调优】03.执行计划

【T-SQL性能调优】04.死锁分析

持续更新......欢迎关注我!

一、TempDB是什么?

1.TempDB是一个系统数据库。从SQL Server2000开始就一直存在。

2.只有Simple恢复模式。自动截断模式。

3.存放局部变量/全局临时表/表变量/临时用法(如hash表等)。

4.机器重启或SQL Server服务重启后,都会按照Model库的配置重新创建。

5.如果临时对象是在会话或存储过程范围内产生的,在会话结束后就会自动回收,不能再查询或使用。

6.默认情况下都具有访问权限。

二、TempDB用来存放什么?

2.1.用户临时对象

(1)由用户再会话中显示创建的实体表和上面的索引。重启后清空。

(2)全局临时表+索引。##开头的表。

(3)局部临时表及上面的索引。#开头的表。

(4)表变量。@开头。

注意:

(1)全局临时表对所有会话都可见。当创建临时表的会话断开数据库的联接,而且也没有活动再引用全局临时表时,SQL Server会自动删除相应的全局临时表。

(2)局部临时表只对创建它的会话再创建级和调用堆栈内部级(内部的过程、函数、触发器、以及动态批处理)是可见的。当创建例程弹出调用堆栈,SQL Server就会自动删除相应的临时表

(3)表变量在tempdb数据库中也有对应的表作为其物理表示。只对当前会话的批处理可见。对调用堆栈中当前批处理的内部批处理是不可见的,对会话中随后的批处理也是不可见的。

(4)根据国外专家的经验,对于大数据,偏向使用临时表,小数据量(一般来说小于100行)则可以使用表变量。


是否具有统计信息


是否可以创建索引


是否是物理存储


临时表


Y


Y


Y


表变量


N


N


N

2.2.内部临时对象

在查询过程中存储临时数据的对象,如Sorts、假脱机、Hash关联和游标等。

可以使用下面的SQL语句进行查看:

SELECT * FROM sys.dm_db_session_space_usage

查看internal_object_alloc_page_count列

2.3.版本存储

开启乐观并发模式后,会使用Temp DB存放修改前的版本数据。

注意:

版本存储将会造成Temp DB的非预期增长,需要对Temp DB的文件大小及使用空间进行监控。

三、TempDB上的存在的性能问题

3.1 空间使用情况

TempDB是系统数据库,被很多地方用到,如果配置和使用不当,空间会被迅速消耗,可能出现报错,影响服务器的正常运行。

查看TempDB的空间使用情况。

3.1.1 可以用性能监视器看下SQL server的空间使用情况。

3.1.2 用SQL语句查询空间使用情况。

(1)查看tempdb的使用情况

Exec sp_spaceused

  

(2)查看tempdb.mdf文件的大小

SELECT * FROM dbo.sysfiles

(3)查看tempdb的使用空间

SELECT * FROM sys.dm_db_file_space_usage

(4)查看会话的空间分配情况,不包含当前活动的任务。

SELECT * FROM sys.dm_db_session_space_usage WHERE session_id > 50

(5)查看TempDB中当前运行任务的信息。

SELECT * FROM sys.dm_db_task_space_usage WHERE session_id > 50

3.1.3 诊断TempDB磁盘问题


错误


引发错误的情况


1101 或 1105


任何会话都必须分配 tempdb 中的空间。


3959


版本存储区已满。此错误在日志中通常出现在错误 1105 或 1101 之后。


3967


由于 tempdb 已满,版本存储区被强制收缩。


3958 或 3966


事务在 tempdb 中找不到所需的版本记录。

3.2 I/O问题

(1)用函数sys.dm_io_virtual_file_stats查看当前实例上的TempDB上的磁盘读写情况。

SELECT  DB_NAME(database_id) AS ‘Database Name‘ ,
        file_id ,
        io_stall_read_ms / num_of_reads AS ‘AVG Read Transfer/ms‘ ,
        io_stall_write_ms / num_of_writes AS ‘AVG Write Transfer/ms‘ ,
        *
FROM    sys.dm_io_virtual_file_stats(-1, -1)
WHERE   num_of_reads > 0
        AND num_of_writes > 0

参考时间:10~20ms 可接受的范围。

(2)大量、频繁地创建和删除临时表及表变量

四、优化TempDB

1.配置文件的大小

默认配置:

初始大小8M

自动增长10%,不限制增长。

这个配置可以修改,要视生产环境的情况而修改。

建议如下配置


tempdb 文件大小


FILEGROWTH 增量


0 至 100 MB


10 MB


100 至 200 MB


20 MB


200 MB 或更多


10%*

2.存放文件的地方

一般要将TempDB的文件单独放到一个磁盘中。如果追求性能,考虑放到RAID0,但是不具有容灾性。

RAID:磁盘阵列

RAID 0 无奇偶校验的条带磁盘。数据横跨所有的物理磁盘,无任何容灾特性。

RAID 1 磁盘镜像。最少需要两个物理磁盘。可同时从两个磁盘读取数据,写数据需要备份到另外一个盘。具有容灾特性。浪费50%的磁盘空间。

RAID 5 具有奇偶校验的条带磁盘。最少需要3个物理磁盘,一个用来存放奇偶校验信息,另外两个用来存放数据,。具有容灾特性。浪费50%的磁盘空间。

RAID 10 或RIAD 0+1 组合。读写性能最好且具有容灾性。

3.文件的个数

TempDB只有一个primary文件组,所有的数据文件都会存放到这个文件组中。常规建议是4个书文件开始,并且需要进行监控,如果发现不够,可以再增加4个。依次类推。建议将文件个数控制再两位数以内。

五、其他

1.不能对TempDB执行什么操作

  • 添加文件组。
  • 备份或还原数据库。
  • 更改排序规则。默认排序规则为服务器排序规则。
  • 更改数据库所有者。tempdb 的所有者是 dbo
  • 创建数据库快照。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 运行 DBCC CHECKALLOC。
  • 运行 DBCC CHECKCATALOG。
  • 将数据库设置为 OFFLINE。
  • 将数据库或主文件组设置为 READ_ONLY。
时间: 2024-12-24 09:18:51

【T-SQL性能优化】01.TempDB的使用和性能问题的相关文章

大话SQL Server性能优化(MSSQL高并发、性能调控、实践)

大话SQL Server性能优化(MSSQL高并发.性能调控.实践)网盘地址:https://pan.baidu.com/s/1KxdfcQD0XGD3M2ja_Y7UWQ 提取码:435v备用地址(腾讯微云):https://share.weiyun.com/5dTuZJ9 密码:xhmge4 本课程源于一家国内较知名的ERP厂商的一款产品出现性能问题后通过咨询服务解决了性能问题,然后根据自身多年技术培训.项目开发.产品研发与运维管理.软件公司内部咨询等经验,整理了在SQL Server 20

php 性能优化之php 语言级的性能优化一

对于这个问题首先我们要知道影响php的性能的原因是什么?也就是 1 什么情况下会出现php性能问题? 1php语法使用不当(包括某些业务可以使用php 本身自带的函数来处理) 2使用php语言做了它不擅长的事 3用php语言链接的服务器不给力(当然如果是localhost也就是你本地配置比较差哈,建议换本吧,哈哈) 4php自身的短板 (PHP 自身就做不了) 5我们也不知道的问题 (囧)   2 php 性能问题简介之php的性能问题的解决方向 从困难度由浅到深分别为: 1 Php 语言级的性

C++应用程序性能优化(一)——应用程序性能优化简介

C++应用程序性能优化(一)--应用程序性能优化简介 一.程序性能优化简介 1.程序性能优化简介 在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制.因此,早期的程序对运行性能和内存空间占用的要求是非常严格的,很多开发人员为了减少1%的CPU运行时间,为减少几十个甚至几个字节而不懈努力.随着计算机技术的快速发展,硬件资源变得相对便宜.但如果认为软件开发时,程序的性能优化不再重要,硬件将解决性能问题也是片面的.计算机硬件的发展解决了部分软件的

android app性能优化大汇总(UI渲染性能优化)

UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑这个问题.研究表明,0-100毫秒以内的延迟对人来说是瞬时的,100-300毫秒则会感觉明显卡顿,300-1000毫秒会让用户觉得“手机卡死了”,超过1000ms就会让用户想去干别等事情了. 这是人类心理学最基础的理论,我们可以从这个角度去优化页面/view/app的加载时间. Ilya Grigo

[转载]网站前端性能优化之javascript和css——网站性能优化

之前看过Yahoo团队写的一篇关于网站性能优化的文章,文章是2010年左右写的,虽然有点老,但是很多方面还是很有借鉴意义的.关于css的性能优化,他提到了如下几点: CSS性能优化 1.把样式表置于顶部 现把样式表放到文档的< head />内部似乎会加快页面的下载速度.这是因为把样式表放到< head />内会使页面有步骤的加载显示. 注重性能的前端服务器往往希望页面有秩序地加载.同时,我们也希望浏览器把已经接收到内容尽可能显示出来.这对于拥有较多内容的页面和网速较慢的用户来说特

Android UI性能优化实战 识别绘制中的性能问题

出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那么近期google又在udacity上开了系列类的相关课程.有了上述的参考,那么本性能优化实战教程就有了坚实的基础,本系列将结合实例为大家展示如何去识别.

Web性能优化系列:10个JavaScript性能提升的技巧

由 伯乐在线 - Delostik 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:jonraasch.com.欢迎加入翻译小组. Nicholas Zakas是一位 JS 大师,Yahoo! 首页的前端主程.他是<高性能 Javascript>的作者,这本书值得每个程序员去阅读. 当谈到 JS 性能的时候,Zakas差不多就是你要找的,2010年六月他在Google Tech Talk发表了名为<Speed Up Your Javascript>的演讲. 但 Javascrip

PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化

2014-09-25 BaoXinjian 一.Insert 性能影响 应用设计不合理导致的session之间的互锁(enqueue)是影响程序可扩展性最常见的原因.此外,一些共享资源的争用,也会导致性能下降. 本篇介绍两个由并发insert操作导致的等待事件(wait event),以及如何通过优化物理设计来进行改善. 普通Insert操作本身产生的是行锁,因此进程相互之间不会锁住(enqueue),但当很多进程insert同一张表时,会有资源上冲突. 以下是两个例子: 1. Buffer b

PHP性能之语言性能优化:安装VLD扩展&mdash;&mdash;检测性能

使用Linux命令安装 //下载安装包 wget http://pecl.php.net/get/vld-0.14.0.tgz //解压包 tar zxvf vld-0.14.0.tgz //进入编译.安装目录 cd vld-0.14.0/ //扩展PHP的扩展木块 phpize //使用locate找到php-config路径 locate php-config 如果提示没有该命令,则运行如下命令 yum -y install mlocate updatedb //更行数据,即可用 //配置编