SQL Server误区30日谈 第8天 有关对索引进行在线操作的误区

 更新时间:2013年01月09日 19:21:31   投稿:mdxy-dxy  
在线索引操作会在操作开始时和操作结束时对资源上短暂的锁。这有可能导致严重的阻塞问题

误区 #8: 在线索引操作不会使得相关的索引加锁

错误!

    在线索引操作并不是想象的那么美好。

    在线索引操作会在操作开始时和操作结束时对资源上短暂的锁。这有可能导致严重的阻塞问题。

    在线索引操作开始时,会在被整理的资源上加一个共享的表锁,这个表锁在会在新的索引创建时、老索引进行版本扫描时一直持续。

    但问题是,这个S锁会和表上的其它锁排成锁队列。这也就是意味着和S锁不兼容的其它锁在表上存在S锁或是表上的锁队列存在中包含S锁时,这类和S锁不兼容的锁操作也需要等待。这也意味着各种更新操作会被阻塞。同样,如果表上存在X锁或是IX锁时,S锁请求也会被阻塞。

    上述步骤完成后,S锁会被去掉,但你可以发现这已经对数据更新产生了影响。这期间还会造成所有等待的更新操作的执行计划被重新编译

    在线索引整理在开始需要加锁的部分完成后,剩下的大部分时间是不需要任何锁的。(这个大部分指的是整个在线索引整理的大部分时间)

    当在线索引操作完成后,新建立的索引和老的索引上面都需要加一个构架修改锁(SCH_M锁)来完成最终操作。这个锁可以想象成一个更强的表级排它锁。这个锁存在期间不允许对表做任何操作,针对表的执行计划也不能重编译。

    在线索引操作最终阶段的阻塞问题和在线索引操作开始时由S锁造成的阻塞问题非常类似-在SCH_M锁持续或者等待被授予期间,不允许对表进行任何操作。反之,表中存在任何读写操作时,SCH_M锁也不能被授予。

    在最终阶段的SCH_M锁持续期间,旧的索引会被执行延迟DROP操作,元数据所指向的分配结构指向新的索引(所以index id不变),表的版本被更新,恭喜,现在开始你已经拥有了一个全新的索引。

    grid.ai

相关文章

  • SQL 将一列拆分成多列的实现示例

    SQL 将一列拆分成多列的实现示例

    在SQL中,有时需要将一列数据按照特定的符号进行分割,分成多个列,本文就来介绍一下SQL 将一列拆分成多列的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • sql查看所有表大小的方法

    sql查看所有表大小的方法

    这篇文章主要介绍了sql查看所有表大小的方法,需要的朋友可以参考下
    2014-02-02
  • SQL Server在T-SQL语句中使用变量

    SQL Server在T-SQL语句中使用变量

    这篇文章介绍了SQL Server在T-SQL语句中使用变量的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Sql Server存储过程详解

    Sql Server存储过程详解

    本文详细讲解了Sql Server的存储过程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SQL Server使用T-SQL创建数据库的操作指南

    SQL Server使用T-SQL创建数据库的操作指南

     T-SQL全称为transact structured query language,事务化的结构查询语言,是对标准SQL语言功能的扩充,可以声明变量,有流程控制语句,支持对流程的控制等,本文给大家介绍了SQL Server使用T-SQL创建数据库的操作指南,需要的朋友可以参考下
    2024-12-12
  • SQL server 2016 安装步骤图文教程

    SQL server 2016 安装步骤图文教程

    本文通过图文并茂的形式给大家介绍了SQL server 2016 安装步骤,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • Sql中Update的From语句及常见更新操作方式

    Sql中Update的From语句及常见更新操作方式

    在SQL中,更新数据是数据库管理中常见且重要的操作之一,本文主要介绍了Sql中Update的From语句及常见更新操作方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • SQLSERVER服务手工启动 批处理文件

    SQLSERVER服务手工启动 批处理文件

    装完SQLSERVER2005 因为开机很慢 所以呢就把开机服务搞成手动的了,这样开机快了很多可是问题也来了每次要用SqlServer的时候要一个一个服务去开起来
    2011-03-03
  • SQLserver 实现分组统计查询(按月、小时分组)

    SQLserver 实现分组统计查询(按月、小时分组)

    首先创建数据表IP地址,访问时间和访问次数。如果每访问一次就插入一条记录,那么AccessCount可以不要,查询时使用count就可以了,这样当访问量很大的时候会对数据库造成很大压力。
    2009-06-06
  • sql server中的任务调度与CPU深入讲解

    sql server中的任务调度与CPU深入讲解

    这篇文章主要给大家介绍了关于sql server中任务调度与CPU的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05

最新评论