我已经设置了 SQL Server 事务复制,然后在订阅者处添加了索引视图,但是索引视图似乎真的减慢了订阅者的速度,几乎让它停止了。
我试图重新初始化订阅,甚至重新创建发布,但问题仍然存在,一旦我添加索引视图,它几乎会降低复制。
有趣的是,我已经在订阅者上有很多索引视图,而且效果很好,但最近我尝试添加更多索引视图,然后一切都开始了,现在我什至连一个索引视图都没有。
有什么建议吗?
我已经设置了 SQL Server 事务复制,然后在订阅者处添加了索引视图,但是索引视图似乎真的减慢了订阅者的速度,几乎让它停止了。
我试图重新初始化订阅,甚至重新创建发布,但问题仍然存在,一旦我添加索引视图,它几乎会降低复制。
有趣的是,我已经在订阅者上有很多索引视图,而且效果很好,但最近我尝试添加更多索引视图,然后一切都开始了,现在我什至连一个索引视图都没有。
有什么建议吗?
好的,我找到了解决方案,我在这里写它不仅是为了帮助遇到类似问题的其他人,而且对于使用索引视图的每个人来说也是值得的。
首先是索引视图的一些要点。
索引视图
索引视图虽然也是“索引”,但也是“视图”,因此当系统从基表上的非聚集索引更新索引视图(甚至覆盖索引和统计信息)时,它可能会受益。
(为了证明这一点,我在数据库中的基表上添加了索引,除了获取复制数据之外没有使用,并且 dm_db_index_usage_stats 系统视图仍然显示用户搜索,唯一使用它的是索引视图。)
并且似乎为了索引视图的利益而添加的最佳索引将用于寻找单个值或小范围的值,因为这是索引视图在本地使用或在订阅者上使用时基本上正在做的事情复制。
尽管索引视图限制不禁止条件连接,但避免它们仍然是一个好主意(就像在常规查询中一样)。
考虑以下联接:
这可能会导致性能瓶颈,最好将其拆分为两个额外的索引视图,然后使用“UNION ALL”将两者结合起来。
虽然索引视图也是一个“视图”,但它也是一个“索引”,换句话说,插入/更新/删除也必须更新索引视图,因此如果视图有性能问题,更新将花费更长的时间,并且在复制的情况,如果每个事务都需要很长时间,那么它们可能会一个接一个地堆积起来,最终导致复制停止
还请记住,在使用复制时,重新初始化订阅者会导致删除所有已在客户端添加的索引和统计信息(如果 pre_creation_cmd 已设置为 drop,这是默认设置),并且只有索引复制本身的一部分将被重新创建,并且必须手动重新创建所有订阅者特定的索引。
因此,在我的情况下,我首先添加了新的索引视图,结果证明它们需要更好的非聚集索引,以及一些使用条件连接的视图,但是在我重新初始化之后,我没有费心首先重新创建基表非聚集索引和试图创建导致复制过程瓶颈的索引视图。