b1k*_*jsh 23 replication sql-server clustered-index index-tuning transactional-replication
我刚刚建立了一个出版物,我正在尝试更快地应用快照。到目前为止,分发代理遵守MaxBCPThreads设置,但快照代理不遵守。我期望它拆分文件,以便分发代理上的线程会去获取数据。但是在我拍摄快照时似乎无法做到这一点。
我在网上看到的一些可能的解决方案在哪里更新代理配置文件(我最初只是用标志编辑了代理步骤,这适用于 dist 代理但不适用于快照)。
我尝试更新代理配置文件,但没有任何区别。我还发现有人说你应该将 sync_method 设置为native所以我检查了我的脚本,我已经创建了指定native模式的发布。
我想知道是否缺少MaxBCPThreads将所有 bcp 文件拆分为不同文件所需的特定设置。
我以为我已经解决了我自己的问题:看起来您必须有一个具有一组不同范围的聚集索引才能让 SQL Server 将文件拆分为多个分区。但是现在我的索引似乎在所有范围内都是 0。
DBCC SHOW_STATISTICS经过额外的测试,我发现这似乎只适用于复制表。如果您要基于(索引)视图进行复制,那么您似乎只能获得 1 bcp 文件,而不是从普通表中获得的分区内容。
问题是:为什么 SQL 复制不能像对普通表那样为索引视图分区 bcp 文件?
我正在复制没有表的索引视图本身(“索引视图作为表”)。原因是我必须加入数据库的识别信息供订阅者用于其他事情。到目前为止,我发现的唯一方法是使用 手动拆分我的视图BETWEEN,这不是特别有效。我希望我可以让 SQL Server 在复制普通表时做我期望的事情。
SQL Server 复制不会像对普通表那样对索引视图的 BCP 文件进行分区,因为索引视图的底层实现和使用与常规表不同。索引视图本质上是具有唯一聚集索引的视图,以提高查询性能。它们旨在预先计算复杂的查询或聚合,以便立即获得结果。
复制索引视图时,快照代理会为整个视图创建单个 BCP 文件。这是因为索引视图代表单个结果集,而常规表可以基于主键或分区列具有多个数据分区。索引视图没有与常规表相同的分区方案,因此 SQL Server 不会以相同的方式拆分 BCP 文件。
要解决此限制,您可以尝试以下选项之一:
正如您所提到的,使用子句手动拆分索引视图BETWEEN。尽管它可能不是最有效的解决方案,但它可以帮助您根据特定范围对 BCP 文件进行分区。
创建一个存储过程,对索引视图中的数据进行分区,然后复制存储过程的执行。这样,您可以自定义分区逻辑并对 BCP 文件的生成方式有更多控制。
考虑复制基表而不是索引视图,然后在订阅者端重新创建索引视图。这种方法需要在订阅者端进行额外的工作,但它允许 BCP 文件像普通表一样进行分区。
请记住,复制性能可能会受到多种因素的影响,例如硬件、网络延迟和数据量。处理大量数据时,您可能需要考虑其他更适合您需求的复制策略或数据同步方法。