MS Sync 框架“为表 xxxx 枚举插入”突然变得异常缓慢

Posted

技术标签:

【中文标题】MS Sync 框架“为表 xxxx 枚举插入”突然变得异常缓慢【英文标题】:MS Sync framework "Enumerating Inserts for Table xxxx" is suddenly extremely slow 【发布时间】:2015-07-16 21:35:22 【问题描述】:

用新信息编辑。

我继承了一个项目,该项目利用 MS Sync Framework 2.1 将 SQL Server CE 3.5 DB 与 SQL Server 2008 R2 同步。大约有 100 万行分布在十几个表中。其中两个表占总行数的约 75%。每天只有几十行更改,并且在这种辐条和集线器布置中只有不到 10 个用户/安装。 同步每天要做的工作很少

此项目的先前版本可以在 1-2 分钟内完成“无操作”同步(在任一端插入、更新或删除零行)。由于我重新生成了.sdf(包括所有数据),现在最少需要 9 分钟,对于某些用户来说,时间要长得多。

通过启用详细同步日志记录,并将新日志文件与旧日志文件进行比较,我将问题缩小到一种操作类型。所有额外的时间都在记录为“为表 xxxxx 枚举插入”的步骤中计算(客户端插入等待转到服务器)。较大的表比较小的表花费的时间更长,但对于这一操作,所有表都成比例地显着增加,即使结果是零行也是如此。

编辑:出现在同步日志中的似乎是不受支持的查询语法(对于 SQL Server CE),显然仅在与服务器资源管理器查询窗口结合使用时才无效。它在 VS T-SQL 编辑器中运行良好。我现在比较了两个实际 查询计划。他们是一样的。从某种意义上说,对大表进行扫描并不奇怪。但是,在 T-SQL 编辑器中,在任一 DB 上都需要相同的时间(约 35 秒)。显然,在该操作期间,同步引擎中发生了更多事情。即使结果在所有情况下都是零行。

当我继承该项目时,它大约进行了一次小升级,但我没有看到任何在源代码控制历史中突出的内容。没有文档可以准确描述之前的开发工作站设置。我已将所有表、列和索引与旧的.sdf 进行了比较。新的.sdf 和旧的.sdf 大小相同。我知道没有更新的库。我完全被难住了。

我忽略了什么?

【问题讨论】:

你是如何重新生成 SDF 的? @JuneT,我通过删除旧的 SDF 重新生成 SDF,双击项目中的 *.SYNC 文件(打开“配置数据同步”对话框),取消选中服务器的更改跟踪(因为服务器端跟踪的处理方式不同),然后单击 [ok]。这会创建 SDF 并将数据复制到其中。这本身就足够了,但我已经采取了额外的步骤,希望能有所帮助:我已经使用新生成的代码重新构建了应用程序,与原始 SDF 执行了完全同步,为每个表调用了 AcceptChanges(),并且在分发之前同步了最后一次。没有帮助。 试试这个:blogs.msdn.com/b/sync/archive/2011/03/02/… 【参考方案1】:

虽然我从未了解为什么在枚举要上传的本地更改时新文件的执行速度比旧文件慢,但我想出了在这种情况下如何让它表现得像它应该的那样(非常快)。

如前所述,框架在生成缓存时不会创建任何索引。一些(实际上很多)实验表明,创建这个索引(在每个表上)似乎是最佳的:create index idx_ChangeTracking on yourTable (__sysChangeTxBsn, __sysTrackingContext, __sysInsertTxBsn);

枚举本地更改现在几乎是即时的,一直以来都应该如此。为什么在生成表时框架没有创建这个索引,为什么它以前不重要(同样重要)?我想我们永远不会知道。

【讨论】:

以上是关于MS Sync 框架“为表 xxxx 枚举插入”突然变得异常缓慢的主要内容,如果未能解决你的问题,请参考以下文章

一连上蓝牙后,按音量加键,死机(有LOG)

同步关系数据库时出现 Microsoft Sync 框架问题

推荐一款 在线+离线数据 同步框架 Dotmim.Sync

Sync framework 2.1 如何发现变化?

滴定分析-酸碱滴定-影响突跃大小的因素

MySQL 写优化 关于 innodb_flush_log_at_trx_commit 和 sync_binlog