我正面临挑战,因为我们的客户在运行所谓的在线维护时会看到不同类型的错误。错误,如超时,扫描停止由于数据移动等。
我们的一些客户购买了,以便能够获得重建索引在线功能。
为了复制这些问题,我一直在一个大型数据库dbcc checkdb上进行测试,重新组织和重建索引以及更新统计数据,而我却在一个几乎为1TB的数据库上用事务轰炸服务器。
我的第一个测试是在maxdop=1处理124000个小事务时使用校验数据库.我从我的应用程序中收到了一个超时,该应用程序将超时设置为5分钟。关于check工作方式的研究,即创建快照、密集地使用tempdb和创建nolocks来创建快照.那么,如果我的一个小事务不锁定表,它怎么会被阻塞呢?
我的第二个测试是在处理124000个事务时重新组织所有索引(这也应该是联机的),这次我遇到了一个死锁.
我的第三个测试是在运行124000个事务时用maxdop=1更新所有统计信息。在这种情况下收到的错误是:由于数据移动,无法继续扫描而没有锁定。
在运行124000事务时,重新构建所有索引的第四次测试将很快运行,我将用结果更新我的帖子。
我在可以使用它的地方使用的maxdop=1是为了消除资源争用。
我读过多篇文章,包括Paul对重建索引的在线和离线的解释,并理解其中的不同之处。但是就像我说的,我被要求解释为什么它不是真的在线,尽管微软声称它是在线的。
如有任何意见,将不胜感激。
我错过了什么
发布于 2020-08-14 17:33:54
这里有很多问题。不过,我觉得答案不会让你开心。
为了复制这些问题,我一直在一个大型数据库dbcc checkdb上进行测试,重新组织和重建索引以及更新统计数据,而我却在一个几乎为1TB的数据库上用事务轰炸服务器。
我不知道我是否把DBCC CHECKDB和“在线维护”混为一谈,但从本质上来说,它肯定不是一种离线活动。尽管如此,它仍然可能是资源密集型的,虽然数据库在技术上仍然是在线的和可用的,但它可能表现为应用程序“不工作”。
我从我的应用程序中收到了一个超时,该应用程序的超时设置为5 minutes...So,如果它不锁定表,如何阻止我的一个小事务?
这并不表示任何阻塞,特别是自DBCC CHECKDB不会造成阻塞以来,除非您指定它应该阻塞。您应该更仔细地观察这些查询,看看超时的原因可能是什么--老实说,这可能是很多事情。
我的第二个测试是在处理124000个事务时重新组织所有索引(这也应该是联机的),这次我遇到了一个死锁.
是索引重新组织语句还是另一个应用程序语句的死锁?我不记得曾经有一次重组导致了这个问题,但是死锁是生活中的一个事实,应用程序应该能够在遇到它们时优雅地重新尝试。在线操作并不能保证您不会陷入死锁。
大多数人将索引维护安排为一夜/周末,以帮助避免与锁定、阻塞和资源争用相关的问题。根据正常的工作时间工作负载进行测试肯定会给您带来一些问题,就像您看到的一样。
我的第三个测试是在运行124000个事务时用maxdop=1更新所有统计信息。在这种情况下收到的错误是:由于数据移动,无法继续扫描而没有锁定。
这是您的责任(或者更确切地说,是应用程序):不要使用NOLOCK,也不会得到与NOLOCK相关的错误。同样,我不确定在大容量期间,我建议更新繁忙系统上的所有状态,所以这似乎是一个注定会有问题的测试。
我读过多篇文章,包括Paul对重建索引的在线和离线的解释,并理解其中的不同之处。但是就像我说的,我被要求解释为什么它不是真的在线,尽管微软声称它是在线的。
如果你读了这篇文章,你就会知道在线并不意味着没有锁。这个词的定义是高度语境的。您可以将您需要的任何人指向关于在线重建的文档:
虽然不常见,但由于用户或应用程序活动,联机索引操作与数据库更新交互时会导致死锁。在这些罕见的情况下,Server数据库引擎将选择用户或应用程序活动作为死锁受害者。
所有这一切都是说,不管维护操作是否能够“联机”,大多数人都不会在全部工作负载期间测试它们,也不会期望它们在正常事务量期间工作良好。
大多数情况下,您实际上不需要重新构建/重新组织所有索引,也不需要同时更新所有状态,即使在维护窗口中也是如此。如果您有一个VLDB,那么将DBCC CHECKDB拆分成不同的窗口(就像Paul已经很好地介绍了)。
我将更多地关注这些事情将如何/何时实际运行。使用类似Ola维修解决方案的东西,这样您就不会让Server做比它必须做的更多的工作。
让你的客户降低他们的期望!
https://dba.stackexchange.com/questions/273768
复制相似问题