我们有一个 SQL Server 数据库,它使用索引视图来高效查询一些定期更改的数据(是的,我知道在数据更改时维护索引会产生成本,但在我们的例子中,这是非常值得的)。
我的理解是,必须像对任何其他表/索引的更改一样记录/备份对视图索引的更改。但是,在我看来,这样的日志记录是多余的,因为在发生崩溃时,SQL 可以很容易地从视图定义中重建视图索引。
有什么办法可以用 SQL Server 实现这样的功能吗?
我们有一个 SQL Server 数据库,它使用索引视图来高效查询一些定期更改的数据(是的,我知道在数据更改时维护索引会产生成本,但在我们的例子中,这是非常值得的)。
我的理解是,必须像对任何其他表/索引的更改一样记录/备份对视图索引的更改。但是,在我看来,这样的日志记录是多余的,因为在发生崩溃时,SQL 可以很容易地从视图定义中重建视图索引。
有什么办法可以用 SQL Server 实现这样的功能吗?
没有
长期以来一直要求 SQL Server 支持未记录的对象。它在其他数据库系统中以不同的形式提供,包括表和物化视图。
然而,在撰写本文时,您无法选择将任何种类的对象标记为在 SQL Server 中未记录。虽然它在逻辑上可能是多余的,但从你的问题中不清楚它是否导致了问题,或者你是否只是不喜欢它并且更喜欢不同的行为。
如果您遇到索引视图维护的性能问题,您可能想提出一个更直接的问题来改进它,而不是寻找当前产品行为的变化。
对于您对恢复(无论是崩溃还是重启)的担忧,您可以利用SQL Server 2019 及更高版本中的加速数据库恢复。
日志记录确保数据库的一致性。在崩溃过程中,对基础表所做的更改可能尚未完成对索引视图的索引的写入。或者更糟的是,如果它在崩溃期间正在回滚更改。
一开始很容易是主观的。如果您的索引视图计算量很大,那么根据日志从中断的地方继续操作可能会更容易、更快捷、更省事。此外,如果在崩溃过程中没有要引用的日志,可能会出现数据丢失的情况,尤其是因为索引视图的结果几乎肯定与基础表的结果不匹配.
不,我不相信。但是比我聪明的人可能会提出建议。
任何启动和故障转移都意味着执行了恢复。任何提交的都应该持久化,所有未提交的都需要回滚。
从这个过程中排除一些东西意味着大多数重启/故障转移都会使您的索引视图不受信任(不仅因为不正确的用户数据,还因为指针失控等)。
Methinks 实现您的要求对 Microsoft 来说是一项艰巨的任务,可能需要对数据库引擎的核心进行重大重新设计。–用户 151544
请记住,日志记录不仅仅用于崩溃恢复。
在传统的ARIES设置中,需要日志 REDO 信息来将已提交事务的影响应用于截至恢复点尚未更新和刷新到稳定存储的任何数据库页面。需要日志 UNDO 信息来撤消已进行更改但从未根据日志提交的事务的影响。
还需要 UNDO 信息来撤销正常数据库操作期间中止事务(由于“回滚”或错误)的影响。
如果您不记录 UNDO 信息,则在数据更改期间从普通错误中恢复可能需要在恢复其引用的对象后重建视图及其索引。那可能不是很受欢迎。
正如另一个答案中提到的,ARIES 的想法在加速数据库恢复(ADR)下以不同的方式实现。日志记录仍然需要像以前一样写入,但重做要快得多,撤消几乎是即时的(尽管后台清理单独继续进行)。
由于写入了相同的日志记录,ADR 似乎没有达到规定的目标,但性能改进和活动日志大小减少可能会。也就是说,ADR 确实有开销并且不适用于短事务,因此您无法完全摆脱传统的 UNDO 处理。
没有什么可以阻止 SQL Server 团队实施
WITH NOINDEXES
备份选项,然后从聚集索引重建它们。换句话说:用于索引视图的相同参数也适用于非聚集索引。但事实是他们没有这样做。这是一个全有或全无的备份过程。即:您甚至不能进行每表备份。这个要求已经很多年了,现在是反馈网站上投票第三高的要求,我强烈建议你也投上一票。