SQL Server误区30日谈 第12天 TempDB的文件数和需要和CPU数目保持一致

误区 #12:TempDB的文件数和需要和CPU数目保持一致

错误

哎,由于上述误区是微软“官方”的建议,并且还有大量博文坚持这个观点,这个误区已经是老生常谈。

但让人困惑的是SQL CAT团队给出的建议就是1:1,但这个建议是源自扩展方面的原理来说,而不是一个通用法则。因为他们所面对的大型客户数据量服务器和IO子系统都是大部分人没有机会遇到的。

每个实例仅仅允许有一个TempDb,但需要用到TempDB的地方却有很多,所以TempDB很容易成为性能瓶颈,我想大家数人都了解这一点,而大多数人所不了解的应该是在什么情况下才需要额外的TempDB文件。

当你看到PAGELATCH类型的阻塞时,说明遇到内存中分配位图的争用问题了。而看到PAGEIOLATCH,说明遇到I/O子系统层面的争用问题了。对于闩锁(Latch)你可以将其看作和普通锁是一种东西,但更轻量,更短,并且只会被存储引擎内部使用。

MVP Glenn Berry 有一篇博文里有查看sys.dm_os_wait_stats的DMV。这篇博文中可以查到你的服务器造成阻塞最多的原因是什么。如果你发现是PAGELATCH型等待,你可以使用这段脚本来查看是由于FPS,GAM还是SGAM争用造成的问题。

如果你遇到闩锁争用,可以通过跟踪标记1118或是多建一个TempDB文件来缓和这个状况(原理可以在知识库KB 328551查到),我已经写了一篇关于为什么追踪标记1118依然被需要的长博文,链接:Misconceptions around TF 1118。

在SQL SERVER 2000时代,TempDB的文件数需要和CPU核数保持1:1的关系,在SQL SERVER 2005和2008版本这条建议也适用,但由于SQL SERVER 2005+后的优化措施(详细请看我的博文),你不再需要严格按照1:1的比例关系设置CPU核数和TempDB文件数,而是文件数和CPU核数的比例保持在1:2或是1:4就行了。

[题外话:在SQL PASS 2011我的好朋友Bob Ward,也是SQL CSS最牛的人。给出了一个新的公式:如果CPU核数小于等于8,使其比例保持在1:1,而如果CPU核数大于8,使用8个文件,当你发现闩锁争用现象时,每次额外加4个文件]

不过这也不能一概而论。上周我遇到一个问题,一个客户的TempDB负载大到需要32个CPU配上64个TempDB文件才能减轻闩锁争用。这是否意味着这是一个最佳实践呢?当然不是。

那你或许有疑问,为什么1:1的比例不好呢,那是因为太多的TempDB有可能引起另一个性能问题。如果你的一条查询中某些操作(比如排序)需要使用大量的内存,但内存不够时,就需要将这些内容分配到TempDB中。当存在多个TempDB文件时,由于TempDB的循环分配机制,这有可能导致性能被拖累,对于比较大的临时表也是如此。

那为什么循环分配机制对于TempDB存在大量文件时产生性能问题呢?有如下几种可能:

循环分配算法是针对文件组而言,而对于TempDB只能存在一个文件组。当这个文件组包含16或32个文件时,由于循环分配算法的线程有限,但对于大量文件的TempDB依然需要做一些额外的同步工作,因此这部分工作会造成性能损失     TempDB的文件大小不一致,则有可能导致某个单独文件的自动增长,从而造成热点IO。     当缓冲区需要通过LazyWriter释放一些空间时(TempDB的Checkpoint不会做写回操作),多个TempDB文件有可能导致IO子系统的随机读写问题,这会导致IO方面的性能问题。   

所以这个选择让你进亦忧,退亦忧。到底多少TempDB文件才是合适的呢?我也不能给你具体答案,但是基于我多年咨询经验以及出席各种大会的经验,我可以给你一个指导方针---当为了解决闩锁争用时为TempDB创建多个文件要小心,仅仅在必须情况下才额外增加TempDB文件。也就是你需要在可扩展性和性能之间取得一个平衡。

希望上面的指导方针对你有帮助。

PS:回应一些评论:TempDB的文件没有必要分布在多个存储器之间。如果你看到PAGELATCH类型的等待,即使你进行了分布也不会改善性能,而如果PAGEIOLATCH型的等待,或许你需要多个存储器,但这也不是必然-有可能你需要讲整个TempDB迁移到另一个存储系统,而不是仅仅为TempDB增加一个文件。这需要你仔细分析后再做定夺。

时间: 2024-09-21 16:34:49

SQL Server误区30日谈 第12天 TempDB的文件数和需要和CPU数目保持一致的相关文章

SQL Server误区30日谈 第30天 有关备份的30个误区_MsSql

误区 #30:有关备份的30个误区全是错的在开始有关备份的误区之前,如果你对备份的基础没有了解,请看之前我在TechNet Magazine的文章:Understanding SQL Server Backups. 30-01)备份操作会导致阻塞不,备份不会导致对用户对象加锁,虽然备份对IO系统的负担导致看起来阻塞了,但实际上不会.唯一的特例是当备份包含到那些最小日志操作涉及到的数据区需要被加锁时,这个操作会阻塞CheckPoint,但DML操作永远不会受到备份操作的阻塞. 30-02)由完整恢

SQL Server误区30日谈 第24天 26个有关还原(Restore)的误区_MsSql

本系列文章一直所没有触及的就是有关"还原(Restore)"的话题,因为一旦牵扯到这个话题就会涉及大量的误区,多到我无法通过一篇文章说完的地步.事实上,我希望用字母表的顺序为每一个误区进行编号,希望你看了不要昏昏欲睡.下面开始揭穿这26个误区. 误区 #24: 26个有关还原(Restore)的误区都是错误的 24 a)可以通过WITH STOPAT参数在完整备份和差异备份的基础上还原到特定时间点当然不能.虽然这个语法看上去貌似能的样子,但这个语法的最佳实践是你在进行日志还原到特定时间

SQL Server误区30日谈 第30天 有关备份的30个误区

误区 #30:有关备份的30个误区 全是错的 在开始有关备份的误区之前,如果你对备份的基础没有了解,请看之前我在TechNet Magazine的文章:Understanding SQL Server Backups. 30-01)备份操作会导致阻塞 不,备份不会导致对用户对象加锁,虽然备份对IO系统的负担导致看起来阻塞了,但实际上不会.唯一的特例是当备份包含到那些最小日志操作涉及到的数据区需要被加锁时,这个操作会阻塞CheckPoint,但DML操作永远不会受到备份操作的阻塞. 30-02)由

SQL Server误区30日谈 第5天 AWE在64位SQL SERVER中必须开启_MsSql

误区 #5: AWE在64位SQL SERVER中必须开启 错误!     在坊间流传的有关AWE的设置的各种版本让人非常困惑.比如说如何设置起作用,如何设置不起作用,在32位和64位上是否需要AWE等.   好吧,我来概括一下:     在64位系统(SQL SERVER 2005+版本) AWE是不需要的(即使是ON状态,也毫无影响) 开启"锁定内存页"使得缓冲池中的内存页不会被置换到虚拟内存中(实际上所有的Single Page Allocator分配和Stolen的内存都不会被

SQL Server误区30日谈 第3天 即时文件初始化特性可以在SQL Server中开启和关闭_MsSql

本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11: Misconceptions about.... EVERYTHING!!,经过我们团队的翻译和整理发布在AgileSharp和博客园上.希望对大家有所帮助. 误区 #3: 即时文件初始化特性可以在SQL Server中 a)开启 和 b)关闭 a)是不允许的  b)是允许的     即时文件初始化是一个在SQL Server 2005以及之上的版本鲜为

SQL Server误区30日谈 第14天 清除日志后会将相关的LSN填零初始化_MsSql

误区 #14.清除日志后会将相关的LSN填零初始化 错误     当日志文件在手动增长,自动增长和创建时都会进行填零初始化操作.但是请不要把这个过程和定期清除日志的过程搞混.日志截断仅仅意味着将一个或多个VLF标记为不活动以便被重复使用.在日志清除的过程中,并没有任何日志被清除或是填0."清除日志"和"截断日志"意思是一样的,但都属于用词不当,因为在这个过程中日志的大小不会有任何改变.     你可以在我的博客中看到有关日志文件填零初始化的博文:Search Eng

SQL Server误区30日谈 第5天 AWE在64位SQL SERVER中必须开启

误区 #5: AWE在64位SQL SERVER中必须开启 错误! 在坊间流传的有关AWE的设置的各种版本让人非常困惑.比如说如何设置起作用,如何设置不起作用,在32位和64位上是否需要AWE等. 好吧,我来概括一下: 在64位系统(SQL SERVER 2005+版本) AWE是不需要的(即使是ON状态,也毫无影响) 开启"锁定内存页"使得缓冲池中的内存页不会被置换到虚拟内存中(实际上所有的Single Page Allocator分配和Stolen的内存都不会被置换) 当开启&qu

SQL Server误区30日谈 第7天 一个实例多个镜像和日志传送延迟_MsSql

误区 #7:一个数据库可以存在多个镜像 错误 这个误区就有点老生常谈了.每一个主体服务器只允许一个镜像服务器.如果你希望存在多个主体服务器的副本,那么请使用事务日志传送,事务日志传送允许针对每一个主体存在多个辅助实例. 使用事务日志传送的一个优点是允许其中一个或多个辅助服务器存在延迟还原备份.这也是就是说对主体服务器进行日志备份(无论你喜欢与否,这几种高可用性技术各自有各自的术语): 数据库镜像:主体服务器-镜像服务器 事务日志传送:主要服务器-辅助服务器 复制:发布服务器-订阅服务器 当使用镜

SQL Server误区30日谈 第11天 镜像在检测到故障后瞬间就能故障转移_MsSql

误区 #11:镜像在检测到故障后瞬间就能故障转移 错误     数据库镜像的故障转移既可以自动发起,也可以手动发起.     在自动发起的情况下,是由镜像服务器执行故障转移操作(你没有看错,并不是由见证服务器来做故障转移的决定),在见证服务器和镜像服务器都发现无法和主体服务器交换信息(这个过程被称为"形成仲裁",译者注:也就是通过程序对集群进行监管,集群可用的依据来自监管程序的算法,比如根据:每个节点的配置,文件共享情况,磁盘访问情况,每个节点的可用性等来确定集群是否可用)并且镜像方式