GCP Spanner:在 Spanner 中批量 update/delete 的分区 dml 很慢,并在 10-15 分钟后超时
GCP Spanner: Partitioned-dml for bulk update/delete in spanner is slow and times out after 10-15 mins
背景:我是运行一些必须清理几千条记录的脚本。虽然 运行 它来自扳手控制台,但我通常会收到类似 - 'Transaction was aborted. It was wounded by a higher priority transaction...' 或 'Transaction is aborted'
这样的错误
我可以理解这可能是由于与实时请求有一些冲突(改天讨论)。所以我正在尝试 GCP 建议的分区 dml 进行此类操作。
问题:我注意到 partitioned-dml 非常慢,当我从云端运行它时它很快超时shell。
我尝试了什么:即使记录很少,我也尝试过,但它需要很多时间,而且记录数以千计时会超时。
示例脚本- gcloud spanner 数据库执行-sql --instance=<> --enable-partitioned-dml --sql='Delete from ABC where X="M" and Y="N"'
云端返回错误信息shell-
"ERROR: (gcloud.spanner.databases.execute-sql) ('The read operation timed out',) This may be due to network connectivity issues. Please check your network settings, and the status of the service you are trying to reach."
这可能与查询本身有关。确保你在它的 WHERE 子句中包含主索引,你可以看到一个例子 here. Also, it is not recommended to use Cloud Shell for such intensive operations。最好使用 Compute Engine VM 连接到它并 运行 从它进行操作。
对于分区 DML,可以不指定主键,因为 Spanner 会自动为您分区事务。但是,它确实必须扫描整个 table,因此当从 shell.
运行 时很容易超时
我不一定会说您需要从 Compute Engine VM 运行 它,因为它不会将数据发送回客户端;但您可能确实希望 运行 来自代码的请求而不是来自 shell 的请求,因此您可以控制超时。示例代码位于 https://cloud.google.com/spanner/docs/dml-partitioned
背景:我是运行一些必须清理几千条记录的脚本。虽然 运行 它来自扳手控制台,但我通常会收到类似 - 'Transaction was aborted. It was wounded by a higher priority transaction...' 或 'Transaction is aborted'
这样的错误我可以理解这可能是由于与实时请求有一些冲突(改天讨论)。所以我正在尝试 GCP 建议的分区 dml 进行此类操作。
问题:我注意到 partitioned-dml 非常慢,当我从云端运行它时它很快超时shell。
我尝试了什么:即使记录很少,我也尝试过,但它需要很多时间,而且记录数以千计时会超时。
示例脚本- gcloud spanner 数据库执行-sql --instance=<> --enable-partitioned-dml --sql='Delete from ABC where X="M" and Y="N"'
云端返回错误信息shell-
"ERROR: (gcloud.spanner.databases.execute-sql) ('The read operation timed out',) This may be due to network connectivity issues. Please check your network settings, and the status of the service you are trying to reach."
这可能与查询本身有关。确保你在它的 WHERE 子句中包含主索引,你可以看到一个例子 here. Also, it is not recommended to use Cloud Shell for such intensive operations。最好使用 Compute Engine VM 连接到它并 运行 从它进行操作。
对于分区 DML,可以不指定主键,因为 Spanner 会自动为您分区事务。但是,它确实必须扫描整个 table,因此当从 shell.
运行 时很容易超时我不一定会说您需要从 Compute Engine VM 运行 它,因为它不会将数据发送回客户端;但您可能确实希望 运行 来自代码的请求而不是来自 shell 的请求,因此您可以控制超时。示例代码位于 https://cloud.google.com/spanner/docs/dml-partitioned