【T-SQL性能优化】01.TempDB的使用和性能问题
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。
本系列【T-SQL基础】主要是针对T-SQL基础的总结。
【T-SQL基础】06.透视、逆透视、分组集
【T-SQL基础】07.数据修改
【T-SQL基础】09.可编程对象
----------------------------------------------------------
【T-SQL进阶】01.好用的SQL TVP~~独家赠送[增-删-改-查]的例子
----------------------------------------------------------
【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。
2、查看TempDB的配置项
SELECT * FROM sys.databases WHERE name = 'tempdb'
参考资料:
https://msdn.microsoft.com/zh-cn/library/ms176029(v=sql.105).aspx
https://msdn.microsoft.com/zh-cn/library/ms345368(v=sql.105).aspx
https://msdn.microsoft.com/zh-cn/library/ms190768(v=sql.105).aspx
《SQL Server 性能优化与管理的艺术》
作 者:
Jackson0714
出 处:http://www.cnblogs.com/jackson0714/
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
【T-SQL性能优化】01.TempDB的使用和性能问题的更多相关文章
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...
- Android UI性能优化实战, 识别View中的性能问题
出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...
- Android UI性能优化实战 识别绘制中的性能问题
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...
- Web性能优化系列:10个JavaScript性能提升的技巧
由 伯乐在线 - Delostik 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:jonraasch.com.欢迎加入翻译小组. Nicholas Zakas是一位 JS 大师,Yahoo! 首页 ...
- PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化
2014-09-25 Created By BaoXinjian
- Web性能优化工具WebPageTest(二)——性能数据
在前一篇<配置>完成后,点击“START TEST”,就可以开始测试,测试需要一段时间. 有时候可能还要排队,如下图所示,测试完成后可查看到测试结果. 一.Summary 1)优化等级 优 ...
- Linux性能优化 第八章 实用工具:性能工具助手
8.1性能工具助手 Linux有丰富的工具,这些工具组合来使用会更加强大.性能工具也一样,单独使用虽然也没有问题,但是和其他的工具组合起来就能显著提高有效性和易用性. 8.1.1 自动执行和记录命令 ...
- PHP性能之语言性能优化:安装VLD扩展——检测性能
使用Linux命令安装 //下载安装包 wget http://pecl.php.net/get/vld-0.14.0.tgz //解压包 tar zxvf vld-0.14.0.tgz //进入编译 ...
- MySQL性能优化最佳实践 - 02 MySQL数据库性能衡量
测试服务器(或虚拟机)的QPS峰值 利用sysbench压测工具模拟SELECT操作 # 已有test库的话先drop掉 drop database test; create database tes ...
随机推荐
- python 线程与进程
线程和进程简介 应用程序和进程以及线程的关系? 一个应用程序里可以有多个进程,一个进程里可以有多个线程 最原始的计算机是如何运行的? CPU是什么?为什么要使用多个CPU? 为什么要使用多线程? 为什 ...
- Java线程池(ThreadPool)详解
线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以 ...
- EasyUI之Hello world(EasyUI的入门学习)
1:创建一个动态web工程: 去官网http://www.jeasyui.net/download/下载官网文档 我去官网下载的最新版本,个人根据自己的需求下载即可.2:在webConte ...
- 存储容量和IOPS的关系
在云计算时代,数据量成几何形式增加,必然会考虑增加存储容量,但是增加存储容量不简单存储性能得到提升,他们之间没有必然的联系: 存储容量,就是指存储设备上能够存储数据的大小,比如,一个磁盘阵列有50T的 ...
- BZOJ 1266: [AHOI2006]上学路线route
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:"很 ...
- Linux添加硬盘和挂载
1.使用fdisk -l 查看硬盘的详细信息 分析: 2.分区初始化 fdisk /dev/sdb 分析:各个参数的解析 1. 输入 m 显示所有命令列示. 2. ...
- 倒计时(距离活动结束还有X天X小时X分X秒)
一个简单的倒计时,可以设定结束时间,然后自动计算出距离活动结束还有X天X小时X分X秒. 废话不多说,上代码,挺简单的,代码里有注释: // 活动倒计时 var time_end = new Date( ...
- Nginx安装lua支持
Nginx安装lua支持 需要LuaJIT-2.0.4.tar.gz,ngx_devel_kit,lua-nginx-module 1.下载安装LuaJIT-2.0.4.tar.gz wget -c ...
- php 知识点 --个人笔记
##2015-09-06 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这时候, ...
- Python数据类型之变量
变量 在程序设计中,变数(英语:Variable,scalar)是指一个包含部分已知或未知数值或资讯(即一个值)之储存位址,以及相对应之符号名称(识别字).通常使用变数名称参照储存值:将名称和内容分开 ...