【问题标题】:GCP Spanner: Partitioned-dml for bulk update/delete in spanner is slow and times out after 10-15 minsGCP Spanner:在 Spanner 中批量更新/删除的分区 dml 速度很慢,并且在 10-15 分钟后超时
【发布时间】:2019-08-02 11:29:16
【问题描述】:

背景:我正在运行一些必须清理几千条记录的脚本。从扳手控制台运行它时,我通常会收到诸如“事务已中止”之类的错误。它被更高优先级的事务弄伤了……”或者只是“事务被中止”

我可以理解这可能是由于与实时请求的一些冲突(改天讨论)。所以我正在尝试 GCP 建议的 partitioned-dml 进行此类操作。

问题:我注意到 partitioned-dml 非常慢,当我从 Cloudshell 运行它时它很快就会超时。

我尝试了什么:我什至尝试了很少的记录,但它花费了很多时间,并且记录了数千个它超时。

示例脚本- gcloud spanner 数据库 execute-sql --instance= --enable-partitioned-dml --sql='Delete from ABC where X="M" and Y="N"'

云壳返回错误信息-

"ERROR: (gcloud.spanner.databases.execute-sql) ('读取操作超时',) 这可能是由于网络连接问题。请检查您的网络设置,以及您所在服务的状态试图到达。”

【问题讨论】:

    标签: google-cloud-platform google-cloud-spanner


    【解决方案1】:

    对于分区 DML,可以不指定主键,因为 Spanner 会自动为您分区事务。但是,它确实必须扫描整个表,因此从 shell 运行时很容易超时。

    我不一定说您需要从 Compute Engine 虚拟机运行它,因为它不会将数据发送回客户端;但您可能确实希望从代码而不是从 shell 运行请求,因此您可以控制超时。示例代码在https://cloud.google.com/spanner/docs/dml-partitioned

    【讨论】:

    • 也许文档在您共享的链接中得到了更新,但我不知道如何从代码中实际设置超时。具体看python客户端中的database.execute_partitioned_dml函数。
    • 我还没有尝试过,但看起来这会传递您提供给 gRPC 调用的任何额外参数:github.com/googleapis/google-cloud-python/blob/master/spanner/… 在这种情况下,我认为您可以按照此处所述传递超时:@ 987654323@
    【解决方案2】:

    这可能与查询本身有关。确保在它的 WHERE 子句中包含主索引,您可以看到一个示例 here。另外,对于这种密集的operations,不建议使用 Cloud Shell。最好使用 Compute Engine VM 连接到它并从中运行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多