SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点使其在一定场景下替代临时表/表变量对象,解决深层次的tempdb竞争问题.
在抛出这个不可避免的问题之前我们先简要看下什么是tempdb竞争.
我们拿SQL Server创建一个临时表的过程来描述
1 在系统表中创建表的条目(系统数据页中)
2 分配一个IAM页并找到一个混合区在PFS页中标记
3 分配一个数据页(查看SGAM页,查看PFS页后并更新,更新IAM页)
4 表记录记录到系统表中
从上述过程可以看出创建一个简单临时表需要查找,更新一系列的系统表/系统数据页,且当使用完删除临时表时上述操作逆向进行.索引相应的创建/销毁一旦大量并发,内部竞争也就产生了.虽然tempdb的缓存策略一定程度可以缓解相应创建过程的IAM,数据页分配, Sql Server tempdb原理-缓存机制解析实践,但竞争依旧.
可以看到SGAM,PFS等系统页是表创建过程的必经之路,他的分配竞争也就十分明显了.这也就是为什么采用多个数据文件,让系统页(包含系统表)在分散在多个数据文件中的以减轻分配竞争的压力原因.
到此也许大家都改猜到了终极问题是什么了,就是对系统对象的操作.连SQL Server大牛Paul Randal都为之头疼的问题.
使用SQLQUERYSTRESS捕捉
Code
create table #t (id int, str1 varchar(10) ) ---SSMS中开启会话捕捉 SELECT resource_description,* FROM SYS.dm_os_waiting_tasks WHERE session_id>50
查看更多关于SQLServer使用游标处理Tempdb究极竞争-DBA问题-程序员必知的详细内容...