Ruby API:即将到期的 Cloud Spanner 行

Ruby API: Expiring Cloud Spanner Rows

我有一个 100 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")}'")

不幸的是我没有日期列,我假设 table 没有分区。目前有没有办法执行这么大的 DELETE 语句,或者我可以通过更改架构以包含 Date 列来修复长 运行 中的 table 吗?

  1. 根据 Spanner’s allowable types,我怀疑 DATETIME 列是 TIMESTAMP 类型。

  2. 当运行分区的DML语句时,table不必先分区,因为这是执行命令时自动完成的过程。这里是关于这个过程的更多信息 https://cloud.google.com/spanner/docs/dml-partitioned#dml_and_partitioned_dml

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

  4. 关于查询,最好使用官方文档中内置的Spanner函数,确保优化。在这种情况下,使用 CURRENT_TIMESTAMP() function along with the TIMESTAMP_SUB() function 将确保在发出减去 X 天数的 TIMESTAMP 值时查询由 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()