SQLServer误区30日谈第8天有关对索引进行在线操作的误区
误区#8:在线索引操作不会使得相关的索引加锁
错误!
在线索引操作并不是想象的那么美好。
在线索引操作会在操作开始时和操作结束时对资源上短暂的锁。这有可能导致严重的阻塞问题。
在线索引操作开始时,会在被整理的资源上加一个共享的表锁,这个表锁在会在新的索引创建时、老索引进行版本扫描时一直持续。
但问题是,这个S锁会和表上的其它锁排成锁队列。这也就是意味着和S锁不兼容的其它锁在表上存在S锁或是表上的锁队列存在中包含S锁时,这类和S锁不兼容的锁操作也需要等待。这也意味着各种更新操作会被阻塞。同样,如果表上存在X锁或是IX锁时,S锁请求也会被阻塞。
上述步骤完成后,S锁会被去掉,但你可以发现这已经对数据更新产生了影响。这期间还会造成所有等待的更新操作的执行计划被重新编译
在线索引整理在开始需要加锁的部分完成后,剩下的大部分时间是不需要任何锁的。(这个大部分指的是整个在线索引整理的大部分时间)
当在线索引操作完成后,新建立的索引和老的索引上面都需要加一个构架修改锁(SCH_M锁)来完成最终操作。这个锁可以想象成一个更强的表级排它锁。这个锁存在期间不允许对表做任何操作,针对表的执行计划也不能重编译。
在线索引操作最终阶段的阻塞问题和在线索引操作开始时由S锁造成的阻塞问题非常类似-在SCH_M锁持续或者等待被授予期间,不允许对表进行任何操作。反之,表中存在任何读写操作时,SCH_M锁也不能被授予。
在最终阶段的SCH_M锁持续期间,旧的索引会被执行延迟DROP操作,元数据所指向的分配结构指向新的索引(所以indexid不变),表的版本被更新,恭喜,现在开始你已经拥有了一个全新的索引。
如你所见,在线索引操作的开始和结束阶段潜在存在着巨大的阻塞问题。所以技术上对在线索引操作应该称为“大部分时间在线索引操作”,但这种叫法可不会受到市场的欢迎。如果你想对在线索引操作了解更多,请阅读白皮书:OnlineIndexingOperationsinSQLServer2005。
译者注:汪洋有一篇关于在线索引操作非常详细的文章,有兴趣的同学可以阅读:联机索引的工作方式,下面我摘抄他文章中的一个图片来让在线索引操作的步骤更加清晰。
相关文章
- SQLServer 错误 7936 表错误:存在对象 ID O_ID,索引 ID I_ID,分区 ID PN_ID 的列 ID C_ID 的 Filestream 目录,但该列不是 Filestream 列。 故障 处理 修复 支持远程
- SQL Server操作:如何删除表(sqlserver删除表)
- 解决SQLServer换行符问题(sqlserver换行符)
- SQLServer数据库的触发器——用途和操作指南(sqlserver数据库触发器)
- 医院信息管理转型——SQLServer数据库实现(医院sqlserver)
- VB编程操作SQLServer的实践实战(vb里sqlserver)
- TP系统实施实践:基于SQL SERVER的智能化应用(tp sqlserver)
- 利用SQLServer进行集合表操作(sqlserver集合表)
- SQLServer带我们走向更高的绩点(sqlserver绩点)
- 编写如何高效使用SQLServer进行查询和编写(sqlserver查询或)
- 使用SQLServer快速操作表(sqlserver操作表)
- 接如何使用SQLServer高效连接进行操作(sqlserver怎么连)
- SQL Server索引优化 提升性能与效率(sqlserver索引优化)
- 善用SQL Server右下角之窍门(sqlserver右下角)
- 借助SQL Server构建智能决策树(sqlserver决策树)
- SqlServer主键标识:索引中枢和表关联(sqlserver主id)
- 深入探索:SQLServer运算功能(sqlserver与运算)
- 使用SQLserver NT 提升企业的管理效能(sqlserver nt)
- PD加强SQLserver数据库应用性能(pd sqlserver)
- 追踪SqlServer数据表的足迹(追踪sqlserver表)
- sqlserver行列互转实现小结
- SQLSERVER如何查看索引缺失及DMV使用介绍