如何解决CockroachDB:为什么删除会随着时间变慢?
我注意到我的 CockroachDB 删除随着时间的推移变得越来越慢。为什么会这样,我该如何解决?
解决方法
来自 CockroachDB 文档: CockroachDB 依靠多版本并发控制(MVCC)来处理并发请求,同时保证强一致性。因此,当您删除一行时,它不会立即从磁盘中删除。该行的 MVCC 值将一直保留,直到由适用区域配置中的 gc.ttlseconds 变量定义的垃圾收集周期过去。默认情况下,此时间段为 25 小时。
这意味着在默认设置下,DELETE 语句的每次迭代都必须扫描过去 25 小时内之前标记为删除的所有行。如果您尝试在同一 25 小时内删除 10,000 行 10 次,则第 10 个命令必须扫描先前标记为删除的 90,000 行。
为了保持迭代 DELETE 查询的性能,我们建议采用以下方法之一:
在每次迭代时,更新 WHERE 子句以仅过滤尚未标记为删除的行。有关示例,请参阅上面的索引过滤器上的批量删除。 在每次迭代时,首先使用 SELECT 语句返回尚未删除的行上的主键值。不会返回标记为删除的行。然后,在较小的批量大小上使用嵌套的 DELETE 循环,过滤主键值。有关示例,请参阅上面对非索引列的批量删除。 要在恒定时间内迭代删除行,使用简单的 DELETE 循环,您可以更改区域配置并将 gc.ttlseconds 更改为低值,例如 5 分钟(即 300),然后每个 GC 间隔运行一次 DELETE 语句。
,为您的 WHERE
查询的 DELETE
部分创建索引:
https://www.cockroachlabs.com/docs/v20.2/indexes#best-practices
阅读更多:
https://www.cockroachlabs.com/docs/v20.2/delete#batch-delete-on-an-indexed-column
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。