我们正在尝试更新/删除数十亿行表中的大量记录。由于这是一张受欢迎的桌子,因此这张桌子的不同部分有很多活动。任何大型更新/删除活动都被长时间阻塞(因为它正在等待获得所有行的锁或页锁或表锁),从而导致超时或需要多天才能完成任务。
因此,我们正在更改一次删除小批量行的方法。但是我们想检查选定的(比如 100、1000 或 2000 行)当前是否被不同的进程锁定。
这是可行的吗?
谢谢,ToC
在 SQL Server 2008 R2 中,这两种回滚有何不同:
运行一条ALTER
语句几分钟,然后点击“取消执行”。完全回滚需要几分钟时间。
运行相同的ALTER
语句,但这要确保LDF
文件不够大,无法成功完成。一旦达到LDF
限制并且不允许“自动增长”,查询执行将立即停止(或发生回滚)并显示以下错误消息:
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
Run Code Online (Sandbox Code Playgroud)
这两者在以下几点上有何不同?
为什么第二次“回滚”是瞬时的?我不完全确定它是否可以称为回滚。我的猜测是,事务日志是随着执行的进行而写入的,一旦它意识到没有足够的空间来完全完成任务,它就会停止并显示一些“结束”消息,而不提交。
当第一次回滚花费这么多时间(回滚单线程)时会发生什么?
2.1. SQL Server 会返回并撤消LDF
文件中的条目吗?
2.2. 该LDF
文件大小在回滚结束变得更小(从DBCC SQLPERF(LOGSPACE)
)
另一个问题:在第二种情况下,SQL Server 开始使用LDF
文件的速度非常快。就我而言,它在前几分钟(< 4 分钟)内从 18% 的使用率增加到 90% …
sql-server sql-server-2008-r2 database-internals rollback transaction-log
在 Sql Server 2014 中,如何查询发布者给定发布的订阅及其文章列表?(事务复制)
是的,有更简单的方法可以从发行商处查询,但我需要从发行商端进行查询。
远程分销商模型(如果有帮助)
谢谢,
replication sql-server transactional-replication sql-server-2014