insert rows into heap/clustered table
Insert row to a heap.
IAM包含一个对象所占用所有空间(extent), PFS包含了所有数据页的空间使用情况的信息。
当向堆(heap)插入一条记录时, sqlserver会检测这个对象的IAM页和PFS页(加上S LATCH),判断是否和可用的数据页,如果有,则向相应的数据页插入数据,如果插入的数据量达到了PFS的阀值,会更新PFS页内的信息(需要U LATCH)
如果没有可用的数据页,则会
如果当前页的数量>8,检测GAM页(加上S LATCH),查看时候有可用的Extent,如果没有,则检测下一个GAM...如果找到可用的extent,则更新相应的GAM,IAM,PFS(需要U LATCH)
如果当前页的数量<8检测SGAM页(加上S LATCH),查看时候有可用的Extent,如果没有,则检测下一个SGAM...如果找到可用的extent,则更新相应的SGAM,IAM,PFS(需要U LATCH)
如果对数据有delete,update操作,导致数据页空间上的变化,也要更新PFS,也可能更新相应的GAM,SGAM,IAM页,这都需要u latch. 可以想象的出,在高并发所以如果在高频发的情况下, 会出现这些分配页上的热点,形成瓶颈(假设其它的资源不是瓶颈)
接下来看看clustered table的情况。
Insert row to a clustered index table
假设clustered key符合unique,narrow,static ,ever-increasing原则。
插入的过程和index seek的过程有些类似, 首先通过root page和 intermate page定位新的行应该插入的位置,这样就定位到了行所在的数据页,然后完成插入操作。
在定位的阶段中,会对root page和intermate leve pages进行锁定(S LATCH), 如果插入的数据量非常大,导致了root page和intermate level pages中的某个页发生了变化,也会对root page和相应的intermate level page进行锁定(U LATCH),对于小数据量的表来说,可能插入了若干行数据后,intermate level pages就需要更新了,再插入更多的数据后,root page也要进行更新。但对于一个大数据量的表来说,这种情况发生的频率会更低。
在实际插入的时候,会对影响的data page进行锁定(U LATCH),完成后更新相应的IAM,GAM页(如果需要申请新的EXTENT)。假设I/O,CPU都不是问题的情况下,这些页就可能成为频繁插入的瓶颈了。目前SQL SERVER并没有内置的解决方案,不过可以考虑使用PARTITION来解决。
参考
http://msdn.microsoft.com/en-us/library/ms187501.aspx
http://sqlblog.com/blogs/linchi_shea/archive/2007/01/22/hash-partition-as-a-design-method.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现