Ruby API:Cloud Spanner行到期

时间:2019-11-04 10:18:46

标签: google-cloud-spanner

我有一个100s的GB大小的Spanner Table,其中有两个字符串和一个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列来修复此表吗?

1 个答案:

答案 0 :(得分:1)

  1. 我怀疑每个Spanner’s allowable types的DATETIME列的类型都是TIMESTAMP。

  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()