CREATE OR REPLACE 语句会影响雪花的时间旅行吗?

Posted

技术标签:

【中文标题】CREATE OR REPLACE 语句会影响雪花的时间旅行吗?【英文标题】:Does CREATE OR REPLACE statement affect time travel in snowflake? 【发布时间】:2021-03-11 02:36:19 【问题描述】:

如果我在雪花中创建一个表,然后使用 CREATE OR REPLACE 语句创建另一个同名的表,我无法使用时间旅行访问第一个表的内容。

例如,如果我运行这段代码

CREATE TABLE "MY_DB"."MY_SCHEMA"."MY_TABLE" (COL1 VARCHAR, COL2 NUMBER);   
INSERT INTO "MY_DB"."MY_SCHEMA"."MY_TABLE" VALUES ('A',1);

...然后在五分钟内运行这段代码

CREATE OR REPLACE TABLE "MY_DB"."MY_SCHEMA"."MY_TABLE" (COL1 VARCHAR, COL2 NUMBER);
INSERT INTO "MY_DB"."MY_SCHEMA"."MY_TABLE" VALUES ('B',2);
SELECT * FROM "MY_DB"."MY_SCHEMA"."MY_TABLE"
UNION
SELECT * FROM "MY_DB"."MY_SCHEMA"."MY_TABLE" AT (offset => -60*1)

查询仅返回第二个表中的值。这种行为是预期的吗?我试图用谷歌搜索或在雪花文档中找到澄清,但没有任何运气......

谢谢

【问题讨论】:

【参考方案1】:

更新:见@peterb 回答“使用time travel at the schema level 恢复旧表”


正如 Mike 所说,之前的表格与 CREATE AND REPLACE 一起被删除,因此时间旅行将无法找到它。

尽管如此,您仍然可以通过重命名新表并取消删除前一个表来恢复数据:

CREATE TABLE "test_travel" (COL1 VARCHAR, COL2 NUMBER);   
INSERT INTO "test_travel" VALUES ('A',1);

CREATE OR REPLACE TABLE "test_travel" (COL1 VARCHAR, COL2 NUMBER);   
INSERT INTO "test_travel" VALUES ('B',2);

ALTER TABLE "test_travel" RENAME TO "test_travel2";

UNDROP TABLE "test_travel";

SELECT *
FROM "test_travel" AT (offset => -60*1)

https://docs.snowflake.com/en/user-guide/data-time-travel.html#restoring-objects

【讨论】:

我很高兴这对您有所帮助!请记得点赞和/或接受对您有用的答案【参考方案2】:

是的 - 这是预期的。通过运行 CREATE OR REPLACE,您已经删除了原始表并将其替换为新表。在替换表发布之前不会有时间旅行数据。

如果您希望从表中删除数据并保留数据以用于时间旅行,请改用TRUNCATE TABLE 语句。

https://docs.snowflake.com/en/sql-reference/sql/truncate-table.html

【讨论】:

还有insert overwrite -- docs.snowflake.com/en/sql-reference/sql/…【参考方案3】:

您还可以使用架构级别的时间旅行将旧表恢复到运行创建或替换表之前的时间:

create schema "MY_DB"."MY_SCHEMA_RESTORED" clone "MY_DB"."MY_SCHEMA" AT (offset => -60*1)

【讨论】:

哦,我喜欢这种方法

以上是关于CREATE OR REPLACE 语句会影响雪花的时间旅行吗?的主要内容,如果未能解决你的问题,请参考以下文章

跨区域的雪花复制:增加任一端的仓库大小会影响速度吗?

MySQL中的replace语句

雪花跟踪器由哪个用户更改

REGEXP_REPLACE 字符串以雪花中的特定子字符串开头和结尾

雪花算法

js的replace函数影响光标定位,怎么解决?