Ruby API:Cloud Spanner行到期

问题描述 投票:0回答:1

我有一个100s的GB大小的Spanner表,其中有两个字符串和一个DateTime列。我正在尝试使用DELETE语句来过期X天行。

到目前为止,使用Ruby API仍无法解决,我在使用时遇到了事务超时错误或Google :: Cloud :: UnavailableError:

spanner.execute_partition_update("DELETE FROM table WHERE datetime < '#{(Date.today - 300).strftime("%Y-%m-%dT%H:%M:%SZ")}'")

很遗憾,我没有Date列,并且我假定该表未分区。目前有没有办法执行这么大的DELETE语句,或者从长远来看,我可以通过更改架构以使其包含Date列来修复此表吗?

google-cloud-spanner
1个回答
1
投票
  1. 我怀疑DATETIME列的类型为Spanner’s allowable types

  2. 运行分区的DML语句时,不必首先对表进行分区,因为这是执行命令时自动完成的过程。这是有关过程https://cloud.google.com/spanner/docs/dml-partitioned#dml_and_partitioned_dml

  3. 的更多信息
  4. 在这种情况下,我建议使用“gcloud” command以确保Ruby客户端库不是导致该问题的因素

  5. 关于查询,最好使用官方文档中的内置Spanner函数以确保对其进行了优化。在这种情况下,将CURRENT_TIMESTAMP() functionTIMESTAMP_SUB() function一起使用将确保在发出TIMESTAMP值减去X天数后,Spanner可以正确处理查询。

在这种情况下,要执行的命令为:

gcloud spanner databases execute-sql [db-name] \
    --instance=[instance-name] --enable-partitioned-dml \
    --sql=”DELETE FROM table WHERE datetime < TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 700 day)“

为了减少读取的行数,如果与TIMESTAMP列相关,则可以对查询中的STRING列之一使用STARTS_WITH()

© www.soinside.com 2019 - 2024. All rights reserved.