如何优化 Zumero 同步查询
How can I optimise Zumero sync queries
我目前在 zumero 同步数据库上遇到非常长的同步时间(超过一分钟),经过一些分析,罪魁祸首似乎是一个特定的查询,它花费了 20 多秒(适当匿名):
WITH relevant_rvs AS
(
SELECT rv.z_rv AS rv FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$rv1340031" rv
WHERE (rv.txid<=913960)
AND NOT EXISTS (SELECT 1 FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$dd1340031" 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$z1340031" 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$old1340031" 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 同步性能服务器端的经验?源表上的任何索引是否传播到这些表?在这种情况下,他们似乎没有。
在 z$old
table 上创建自定义索引应该是安全的。我希望它有助于提高您的查询性能! (很高兴看到评论让我们知道是否如此。)
我认为此类索引可能导致的唯一问题是它可能会阻止主机上的某些模式更改 table。例如,如果您尝试从主机 table 中删除 [MyOtherField]
列,Zumero 触发器也会尝试从 z$old
table 中删除相同的列,并且事务将因错误而失败(这可能有点令人惊讶,因为索引不在直接作用于的 table 上)。
另一件需要考虑的事情:如果它曾经出现在错误消息中,给这个新索引起一个名字 recognized/helpful 可能也有帮助。然后(一如既往)随时联系 support@zumero.com 提出任何进一步的问题。
我目前在 zumero 同步数据库上遇到非常长的同步时间(超过一分钟),经过一些分析,罪魁祸首似乎是一个特定的查询,它花费了 20 多秒(适当匿名):
WITH relevant_rvs AS
(
SELECT rv.z_rv AS rv FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$rv1340031" rv
WHERE (rv.txid<=913960)
AND NOT EXISTS (SELECT 1 FROM zumero."mydb_089eb7ec0e2e4772ba0dde90170ee368_mysynceddb$z$dd1340031" 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$z1340031" 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$old1340031" 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 同步性能服务器端的经验?源表上的任何索引是否传播到这些表?在这种情况下,他们似乎没有。
在 z$old
table 上创建自定义索引应该是安全的。我希望它有助于提高您的查询性能! (很高兴看到评论让我们知道是否如此。)
我认为此类索引可能导致的唯一问题是它可能会阻止主机上的某些模式更改 table。例如,如果您尝试从主机 table 中删除 [MyOtherField]
列,Zumero 触发器也会尝试从 z$old
table 中删除相同的列,并且事务将因错误而失败(这可能有点令人惊讶,因为索引不在直接作用于的 table 上)。
另一件需要考虑的事情:如果它曾经出现在错误消息中,给这个新索引起一个名字 recognized/helpful 可能也有帮助。然后(一如既往)随时联系 support@zumero.com 提出任何进一步的问题。