设为首页 收藏本站
查看: 1897|回复: 0

[经验分享] 【T-SQL性能优化】01.TempDB的使用和性能问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-7-14 17:52:09 | 显示全部楼层 |阅读模式
  以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通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.默认情况下都具有访问权限。


DSC0000.png


二、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列

DSC0001.png



2.3.版本存储

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

DSC0002.png

注意:

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


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

3.1 空间使用情况

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

查看TempDB的空间使用情况。

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

DSC0003.png


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

(1)查看tempdb的使用情况




Exec sp_spaceused

DSC0004.png   

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




SELECT * FROM dbo.sysfiles

DSC0005.png

(3)查看tempdb的使用空间




SELECT * FROM sys.dm_db_file_space_usage

DSC0006.png

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




SELECT * FROM sys.dm_db_session_space_usage WHERE session_id > 50

DSC0007.png

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




SELECT * FROM sys.dm_db_task_space_usage WHERE session_id > 50

DSC0008.png

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
DSC0009.jpg

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


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


四、优化TempDB

1.配置文件的大小

默认配置:

初始大小8M

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

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

DSC00010.png

建议如下配置



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'

DSC00011.png


参考资料:

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 性能优化与管理的艺术》

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393917-1-1.html 上篇帖子: MS SQL巡检系列——检查外键字段是否缺少索引 下篇帖子: MySQL错误: could not retrieve transation read-only status server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表