SQL Server误区30日谈 第2天 DBCC CHECKDB会导致阻塞

 更新时间:2013年01月09日 18:46:54   作者:  
在SQL Server 2000中,这个命令阻止事务日志截断将会导致日志不正常增长的相关问题,但对于SQL Server 2005来说,这个命令就会导致快照相关的问题(具体请往下看)。

误区 #2: DBCC CHECKDB会引起阻塞,因为这个命令默认会加锁

这是错误的!

    在SQL Server 7.0以及之前的版本中,DBCC CHECKDB命令的本质是C语言实现的一个不断嵌套循环的代码并对表加表锁(循环嵌套算法时间复杂度是嵌套次数的N次方,作为程序员的你懂得),这种方式并不和谐,并且…..

    在SQL Server 2000时代,一个叫Steve Lindell的哥们(现在仍然在SQL Server Team)使用分析事务日志的方法来检查数据库的一致性的方式重写了DBCC CHECKDB命令。DBCC CHECKDB会阻止截断日志。当将日志从头读到尾时,在事务日志内部进行了某种Recovery操作,这实际上是另一种全新的实现Recovery的代码,但是仅限于CHECKDB命令内部。但这种方式依然存在问题,比如这个命令存在检查失败的可能性,如果检查失败,你还需要重新执行它看是否还会出现同样的错误。并且有时候,这个命令还会使用SCH_S锁,索然这个锁仅仅阻塞表扫描和表构架的改变,但通过日志来检查一致性的代码也并不是尽善尽美,并且…..

    在SQL Server 2005时代,一个叫Paul Randal的家伙(译者:也就是本文作者)再次重写了DBCC CHECKDB命令。这次使用数据库快照来检查一致性(因为数据库快照会提供在数据库某一特定时间点的一致性视图),因此不再有事务日志的分析代码,不再有任何的锁--因为访问数据库快照不需要对原数据库加任何的锁,缓冲池会自动处理可能出现的资源争用。

   

    如果想了解更多内幕消息,你可以阅读下面的文章:

    现在,在任何SQL Server版本中,如果你依然使用WITH TABLOCK提示,那将会产生表锁来保证事务的一致性。但我不推荐这种方式。因为这种方式不仅需要更长的时间,还将会尝试对数据库加排他锁,但已经活动在数据库的连接有可能导致这种方式失败。

    在SQL Server 2000中,这个命令阻止事务日志截断将会导致日志不正常增长的相关问题,但对于SQL Server 2005来说,这个命令就会导致快照相关的问题(具体请看上面的链接)。

    但是在默认情况下,自从SQL SERVER 2000之后,DBCC CHECKDB不会再产生阻塞。

相关文章

  • SQL语句(T-SQL汇总) 用T-SQL画出这些图形

    SQL语句(T-SQL汇总) 用T-SQL画出这些图形

    今天和大家一起来分享一下SQL语句,T-SQL的用法和语法,以及一些例子,目的是帮助大家一起来复习一下T-SQL的基本语句,以便在项目中更快速的运用,当然对于新手来说就更应该去学习和总结了
    2012-07-07
  • 获取SqlServer存储过程定义的三种方法

    获取SqlServer存储过程定义的三种方法

    这篇文章主要介绍了获取SqlServer存储过程定义的三种方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 浅析SQL Server的聚焦使用索引和查询执行计划

    浅析SQL Server的聚焦使用索引和查询执行计划

    本文通过介绍默认使用索引、强制使用聚集索引、强制使用非聚集索引让我们知道对于检索所有列结果集使用主键的聚集索引是最佳选择。有兴趣的朋友可以看下
    2016-12-12
  • SQL Server实现分页方法介绍

    SQL Server实现分页方法介绍

    这篇文章介绍了SQL Server实现分页的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 验证SQL保留字

    验证SQL保留字

    验证SQL保留字...
    2006-07-07
  • 浅谈SQLServer的ISNULL函数与Mysql的IFNULL函数用法详解

    浅谈SQLServer的ISNULL函数与Mysql的IFNULL函数用法详解

    本篇文章是对SQLServer的ISNULL函数与Mysql的IFNULL函数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 索引的原理及索引建立的注意事项

    索引的原理及索引建立的注意事项

    聚集索引,数据实际上是按顺序存储的,数据页就在索引页上。就好像参考手册将所有主题按顺序编排一样。一旦找到了所要搜索的数据,就完成了这次搜索,对于非聚集索引,索引是安全独立于数据本身结构的,在索引中找到了寻找的数据,然后通过指针定位到实际的数据
    2012-07-07
  • 异地远程访问本地SQL Server数据库

    异地远程访问本地SQL Server数据库

    数据库的重要性相信大家都有所了解,作为各种数据的电子资料夹,其中可能包含了各种信息,这篇文章就为大家介绍了如何使用cpolar内网穿透,远程连接和操作SQL Server。
    2023-04-04
  • SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息

    SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息

    这篇文章主要介绍了SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息的相关资料,需要的朋友可以参考下
    2015-11-11
  • SQL Server作业报错特殊案例分析

    SQL Server作业报错特殊案例分析

    这篇文章主要给大家介绍了关于SQL Server作业报错特殊案例的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用SQL Server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论