我有一个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列来修复此表吗?
答案 0 :(得分:1)
我怀疑每个Spanner’s allowable types的DATETIME列的类型都是TIMESTAMP。
在运行分区DML语句时,不必首先对表进行分区,因为这是执行命令时自动完成的过程。这是有关流程https://cloud.google.com/spanner/docs/dml-partitioned#dml_and_partitioned_dml
在这种情况下,我建议使用“gcloud” command来确保Ruby客户端库不是导致该问题的因素
关于查询,最好使用官方文档中的内置Spanner函数以确保对其进行了优化。在这种情况下,将CURRENT_TIMESTAMP() function与TIMESTAMP_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()。