【问题标题】:How can I optimise Zumero sync queries如何优化 Zumero 同步查询
【发布时间】:2015-09-24 13:24:21
【问题描述】:

我目前在 zumero 同步数据库上经历了非常长的同步时间(超过一分钟),经过一些分析,罪魁祸首似乎是一个需要 20 多秒的特定查询(适当地匿名):

WITH relevant_rvs AS
(
  SELECT rv.z_rv AS rv FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$rv$271340031" rv
  WHERE (rv.txid<=913960)
  AND NOT EXISTS (SELECT 1 FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$dd$271340031" dd WHERE dd.rv=rv.z_rv AND (dd.txid<=913960))
)
INSERT INTO #final_included_271340031_e021cfbe1c97213dd5adbacd667c08439fb8c6 (z_rv)
SELECT z$this.z_rv
 FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$271340031" z$this
  WHERE (z$this.z_rv IN (SELECT rv FROM relevant_rvs))
  AND MyID = (MyID = XXX AND MyOtherField=XXX)
UNION SELECT z$this.z_rv
 FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$old$271340031" z$this
  WHERE (z$this.z_rv IN (SELECT rv FROM relevant_rvs))
  AND (MyID = XXX AND MyOtherField=XXX)

我已获取查询的后 SELECT 部分并单独运行它,这重现了同样糟糕的性能。有趣的是,执行计划建议应用索引,但我不愿意更改 zumero 生成表的架构,是否可以安全地尝试向这些表中添加索引并且可能会有所帮助?

源表中有 100,000 条记录,过滤器导致每个客户端同步 100-1000 条记录,因此数据量不是微不足道的,但我认为不会在查询性能方面造成重大问题的级别。

有人有优化 Zumero 同步性能服务器端的经验吗?源表上的任何索引是否会传播到这些表?在这种情况下,它们似乎没有。

【问题讨论】:

  • 好奇 - 执行计划建议的索引是什么?
  • @PaulRoub CREATE NONCLUSTERED INDEX [&lt;Name of Missing Index, sysname,&gt;] ON [zumero].[mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$old$271340031] ([MyID],[MyOtherField]) INCLUDE ([z_rv])

标签: sql-server zumero


【解决方案1】:

z$old 表上创建自定义索引应该是安全的。我希望它有助于提高您的查询性能! (很高兴看到评论让我们知道是否这样做。)

我相信这样的索引可能导致的唯一问题是它可能会阻止主机表上的某些架构更改。例如,如果您尝试从主机表中删除 [MyOtherField] 列,Zumero 触发器也会尝试从 z$old 表中删除同一列,并且事务将失败并出现错误(可能是有点令人惊讶,因为索引不在直接作用的表上)。

另一件需要考虑的事情:如果它出现在错误消息中,给这个新索引起一个可以被识别/有帮助的名称也可能会有所帮助。然后(一如既往)随时联系 support@zumero.com 如有任何进一步的问题或问题。

【讨论】:

  • 应用索引在同步方面产生了一些非常显着的性能改进,总同步时间现在 >10 秒。现在唯一的挑战是弄清楚如何编写一个通用脚本,当有问题的表在每个数据库上具有不同的名称时,将这些索引应用于我们客户的任何数据库上的正确表......有没有简单的方法查找这些表名还是查询系统表的情况?
  • 我能想到的检测表格的唯一方法是在表格名称中查找某些文本序列以及其中是否存在某些列(以将其与其他表格区分开来在同一个同步模式中),这有点可怕,所以任何关于更优雅解决方案的指针都将不胜感激!
  • z$old 表的名称,例如,DBFile 名称后跟$z$old$,后跟表的对象 id。可以使用OBJECT_ID 函数找到表的对象 ID,如下所示:SELECT OBJECT_ID('dbo.MyTable', 'U')
  • 谢谢,这应该可以帮助我编写一个更简洁的脚本来应用索引
  • FWIW:关于 z$old 表的自定义索引的简要说明已添加到 ZSS 管理器文档的新“高级调整”部分:zumero.com/docs/…
猜你喜欢
  • 2014-03-13
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2017-06-15
  • 1970-01-01
  • 2019-10-07
  • 2023-04-02
相关资源
最近更新 更多