解决合并复制中的过滤问题

pet*_*ter 6 sql-server merge-replication

我正在为我们的数据库定义合并复制发布的过滤器。

我遇到的问题是合并复制有这些规则,我不喜欢称它们为限制,因为我可以理解其目的。

1) 创建文章过滤器时不能包含子查询,或者至少不应该包含。如果你这样做,它会在你第一次同步时出现,但如果子查询表中的某些内容发生变化,则不会重新评估过滤器。

2) 使用连接过滤器时,您只能将两个表连接在一起。

我遇到的问题是我们数据库中的关系比这更复杂。例如这里是我们的关系之一,

user <- regions selected <- STREET LIGHTS -> settings (are we syncing street lights) -> user
Run Code Online (Sandbox Code Playgroud)

这是一个示例表结构,可以更详细地解释上述内容,

用户表,

Id    Username
1     petermc
Run Code Online (Sandbox Code Playgroud)

UserRegion 表,(把它想象成一个安全表,允许特定用户查看哪个区域)

Id    UserId    RegionId
1     1         2
1     2         4
Run Code Online (Sandbox Code Playgroud)

同步设置表,

Id    UserId    Table
1     1         StreetLight
Run Code Online (Sandbox Code Playgroud)

区域表(这只是显示一些示例区域的查找表)

Id    Region Name
1     North Auckland
2     South Auckland
3     Central Auckland
4     Great Barrier Island
Run Code Online (Sandbox Code Playgroud)

路表,

Id    RegionId    Name
1     1           Rosedale Rd
2     1           North Shore Rd
Run Code Online (Sandbox Code Playgroud)

路灯桌

Id    RoadId    Last Replaced
1     1         2012-05-01
2     1         2009-06-03
3     2         2001-06-08
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,如果我写出一个 select 语句来应用我对 petermc 的过滤,它看起来像这样,

select * from StreetLight where
roadId in (select Id from Road where RegionId in (select regionId from UserRegion where userid = 1))
and exists (select 1 from syncsetting where userid = 1 and [table] = 'StreetLight')
Run Code Online (Sandbox Code Playgroud)

所以我在那里做两件事。首先基于区域进行过滤,将非常大的表缩减为更小的更易于管理的子集。

第二个是指定订阅者是否对 StreetLight 表感兴趣。如果不是,那么订阅者应该有一个空的 StreetLight 表。这部分很重要,因为发布将包含大量表,因此包含订阅者不会使用的内容是没有意义的。

我们最大的数据库在某些表中有数百万条记录,这些记录也会有适度的更新。我们必须正确地进行这种过滤。不过滤这些表的选项是不可行的。

pet*_*ter 1

我必须发出警告。我们现在已经放弃了合并复制,我不得不建议上面的方案可能是一个主要的性能问题。

例外情况是,您需要拥有一份小型出版物,其中包含少量过滤和/或深度不深的过滤器。例如,10 - 100 篇文章可能效果很好。如果你过多地推行上述方案,你可能会遇到性能/锁定问题。

每次将记录插入顶级过滤表时,合并复制触发器都必须处理所有子表。它还将记录添加到所有子表的 MSMerge_contents 和 MSMerge_genhistory 中。您拥有的子表越多,并且其中包含大量记录,则需要的处理能力就越强。

我们遇到了 sp_MSsetupbelongs 太慢并且超时的问题。最后我们得出的结论是,我们过度推动合并复制,这项技术对我们不起作用。

这让我建议,如果开箱即用的合并复制中的过滤方案对于您的情况来说不够灵活,那么要么不过滤,要么不使用合并复制。测试测试当然,每种情况都是不同的。