雪花:创建或替换表与插入覆盖到表

时间:2021-04-29 20:03:19

标签: snowflake-cloud-data-platform

我正在 Snowflake 中创建一个表,该表将由 SQL Server 存储过程(使用 Openquery)用于返回数据。

Snowflake 任务执行刷新表中的数据时,运行"create or replace table" 语句好还是使用"insert overwrite into table" 语句好?

我希望避免 SQL Server 存储过程没有可用数据的时间段。

这些方法中的一种是否更好地保持现有数据可用,直到刷新表的任务完成?

1 个答案:

答案 0 :(得分:1)

哈特菲尔德

有几种方法可以解决这个问题,您提到的 2 种方法最简单,也可能是最常用的。由于 Snowflake 基于 AutoCommit 前提工作,您应该能够使用“创建或替换”,并且如果在“创建或替换”仍在运行时有查询正在消耗数据,结果仍将返回旧结果直到“创建或替换”完全提交。这是已提交读隔离级别的一部分,这是 Snowflake 当前用于表的内容。如果您想确保您的 Create 或 Replace 作为事务运行,您可以在开始时抛出 BEGIN 并在最后抛出 COMMIT 但如果您只执行该单个“创建或替换”语句,则不需要它。

还有另一种方法可能会引起人们的兴趣并且不时派上用场。数据流看起来像这样,使用您要使用的新数据创建一个新表。然后在接下来的步骤中,您将当前表重命名为其他名称,然后使用以前的当前表名称重命名新表。您可以将其包装在事务中以确保回滚,以防万一失败。用于重命名的 2 ALTER TABLE 语句将在眨眼间发生。使用或不使用此方法有不同的原因。如果您采用这种方法,您需要考虑一些事情,即如果您对原始/当前表有任何权限,则需要将这些权限应用于新表,如果您在原始表上有聚集键还需要将这些应用于新表。

我希望这在某种程度上有所帮助。