以下语句在等待页(1:4365112)的缓冲区锁存类型2(数据库ID 12)时发生超时时失败。
alter table [T] add Id bigint identity(1, 1)
表T有500万行,每个行都有一些大的文本列,共计60 of。它的设计很差,因此我们试图用一个简单的整数自动增量ID和非聚集索引替换它的当前标识列,即设置为聚集索引的GUID字符串列。表只被附加到-它是一个审计日志。它的数据很少被查看,但是由于聚集索引和表太大,它消耗了大量的RAM。
ALTER语句在较小的副本上工作,但在较大的表上出现给定的错误时失败,我们可能需要它来处理具有10倍多行的表。上述消息在大约1小时后出现。
如果我们将数据库放置在单用户模式中,则会得到类似的错误,但速度略快,大约45分钟内:等待缓冲区锁存类型4的页面(1:4495724)出现超时,数据库ID为12。
我们可以以不同的方式完成相同的任务,例如,定义一个新表,然后编写一些task来逐步插入行并建立新的索引,然后删除原来的表。但如果有办法使改变工作,这将是更简单的,所以任何建议都会受到欢迎。
SQL 2019,测试服务器上几乎没有负载。物理服务器,大量磁盘和RAM,SSD驱动器。
发布于 2022-04-13 18:48:14
问题似乎是由于磁盘访问速度慢和其他进程造成的。
我们查看了SQL错误日志、Windows事件查看器和SQL活动监视器。事件查看器中发布了一个硬件I/O错误,我们发现Acronis备份(使用VSS)一直在运行。我们进一步发现,由于其大小,此特定数据库安装在单独的SATA驱动器上,而不是安装在此服务器上的其他数据库的主SSD驱动器上。(因此,我原来的帖子是错误的。)。
因此,总之,我们发现数据库处于一个较慢的驱动器上,并且它是由备份子系统持续执行的。这使SATA磁盘紧张到无法完成操作,并在事件查看器中抛出错误。
我们将数据库移动到SSD/RAID驱动器集,减少了备份频率,然后在30分钟内完成了该操作。我没有尝试它的备份关闭和在SATA驱动器,但我认为这将是慢得多。
https://dba.stackexchange.com/questions/310580
复制相似问题