【发布时间】:2012-10-12 04:00:49
【问题描述】:
我有一个 SQL 服务器,它设置了合并复制到 800 个运行 SQL CE 的移动客户端。
服务器有足够的资源,进出公司的线路绰绰有余,客户端和服务器之间的复制通常很好,但我们遇到了一个我无法追踪的间歇性错误。
昨天我们需要将 550 条记录插入到我们的一个主表中,唯一存在的触发器是标准的合并复制触发器。
此插入需要 14 小时,因为它不断与尝试同步的移动设备陷入僵局。
对于如何避免插入锁定以及如何加快整个过程,有人有什么建议吗?
----- 更新-----
从一些 cmets 开始,我在单个插入上运行了分析器,我看到了很多这样的事情
insert into dbo.MSmerge_current_partition_mappings with (rowlock) (publication_number, tablenick, rowguid, partition_id)
select distinct 1, mc.tablenick, mc.rowguid, v.partition_id
from dbo.MSmerge_contents mc with (rowlock)
JOIN dbo.[MSmerge_JEMProjectME_PromotionResource_PARTITION_VIEW] v with (rowlock)
ON mc.tablenick = 286358001
and mc.rowguid = v.[rowguid]
and mc.marker = @child_marker
and v.partition_id in (select partition_id from dbo.MSmerge_current_partition_mappings cpm with (rowlock) JOIN
dbo.MSmerge_contents mc2 with (rowlock)
ON cpm.rowguid = mc2.rowguid
and mc2.marker = @marker)
where not exists (select * from MSmerge_current_partition_mappings with (readcommitted, rowlock, readpast) where
publication_number = 1 and
tablenick = 286358001 and
rowguid = v.[rowguid] and
partition_id = v.partition_id)
对于许多我不打算插入的表...这可能是一个线索吗?
【问题讨论】:
-
1. insert 和 syncs 使用的隔离级别是什么?通常插入应该不是问题。 2. 你有多少个索引? 3. 你有不是增量的索引,会导致记录被插入树结构的中间而不是末尾? 4. 你有聚集索引吗?
-
1.不确定隔离级别..这只是一个标准的插入语句 - 2. 我们正在插入具有 1 个标准索引的表 A.. 但是合并复制触发器将其粘贴到许多其他表中 - 3. 不在我们插入的表上进入 - 4. 没有
-
1.您是否有在复制期间被调用的查询,可能是复制过程在您的案例堆中阻塞了整个表(您没有聚集索引) 2. 表上是否有唯一键?
-
是的,进程和其他复制请求一直都在进来。我们有大约 800 个移动客户端,每个客户端每天复制大约 10 次,因此它们经常相互重叠,并且工作......只是重新检查。表上没有唯一键
-
我建议在表上设置聚集索引,它是顺序的,并确保复制基于它进行选择,并且复制和插入不应该在 SERIALIZABLE 事务隔离级别上运行,这样你会没有 RangeS-S 或 RangeI-N 锁,如果您有死锁图,这很可能是死锁原因。
标签: sql sql-server-2008 merge-replication