我目前在一个同步的数据库上经历了很长的同步时间(很长一分钟),在一些分析之后,罪魁祸首似乎是一个花费了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生成表的架构,是否在这些表中添加索引--这是可以安全地尝试的,并且可能会有所帮助?
源表中有100000个in记录,过滤器会在每个客户端同步100-1000ish记录,所以不是微不足道的数据量,而是级别,我不希望在查询性能方面造成重大问题。
有没有人有过优化祖莫同步性能服务器端的经验?源表上的任何索引是否传播到这些表?在这种情况下他们似乎没有。
发布于 2015-09-24 15:36:44
在z$old表上创建自定义索引应该是安全的。我确实希望它有助于提高您的查询性能!(如果能看到一条评论,让我们知道它是否存在,那就太好了。)
我认为这样的索引可能导致的唯一问题是它可能阻止主机表上的某些模式更改。例如,如果您试图从主机表中删除[MyOtherField]列,则Zumero触发器也将尝试从z$old表中删除同一列,事务也会失败,从而出现错误(这可能有点令人吃惊,因为索引不在直接操作的表上)。
另一件需要考虑的事情是:如果这个新索引出现在错误消息中,它可能也会帮助这个新索引的名称被识别/帮助。然后(一如既往)随时与support@zumero.com联系,如果他们有任何进一步的问题或问题。
https://stackoverflow.com/questions/32762560
复制相似问题