gpt4 book ai didi

google-cloud-spanner - 无法从 Spanner 中删除大量行

转载 作者:行者123 更新时间:2023-12-02 19:51:21 27 4
gpt4 key购买 nike

我有 3 个节点的 Spanner 实例,以及一个包含大约 40 亿行的表。 DDL 如下所示:

CREATE TABLE predictions (
name STRING(MAX),
...,
model_version INT64,
) PRIMARY KEY (name, model_version)

我想设置一个作业,使用 Python Spanner 客户端定期从该表中删除一些旧行。我想运行的查询是:

DELETE FROM predictions WHERE model_version <> ? 

根据文档,听起来我需要将其执行为 Partitioned DML陈述。我按如下方式使用 Python Spanner 客户端,但由于表中的行数过多而遇到超时(504 Deadline Exceeded 错误)。

# this always throws a "504 Deadline Exceeded" error
database.execute_partitioned_dml(
"DELETE FROM predictions WHERE model_version <> @version",
params={"model_version": 104},
param_types={"model_version": Type(code=INT64)},
)

我的第一直觉是看看是否可以增加某种超时,但我在 the source 中没有看到任何超时参数。 :/

我确实注意到 Spanner 库中有一个 run_in_transaction 方法,其中包含超时参数,因此我决定偏离分区 DML 方法,看看使用此方法是否有效。这是我运行的内容:

def delete_old_rows(transaction, model_version):
delete_dml = "DELETE FROM predictions WHERE model_version <> {}".format(model_version),
dml_statements = [
delete_dml,
]
status, row_counts = transaction.batch_update(dml_statements)


database.run_in_transaction(delete_old_rows,
model_version=104,
timeout_secs=3600,
)

奇怪的是 timeout_secs 参数似乎被忽略了,因为在执行上述代码的一两分钟内我仍然收到 504 Deadline Exceeded 错误,尽管超时一小时。

无论如何,我不太确定下一步要尝试什么,或者我是否错过了一些明显的东西,这些东西可以让我在这个巨大的 Spanner 表上及时运行删除查询。 model_version 列的基数非常低(整个表中通常有 2-3 个唯一的 model_version 值),因此我不确定这是否会影响任何建议。但如果有人可以提供一些意见或建议,那就太好了:)提前致谢

最佳答案

设置 timeout_secs 没有帮助的原因是不幸的是,参数不是事务的超时。这是retry timeout对于交易,因此它用于设置截止日期,在此之后交易将停止重试。

我们将更新 run_in_transaction 的文档以更好地解释这一点。

关于google-cloud-spanner - 无法从 Spanner 中删除大量行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58107953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com