使用临时表和瞬态表¶
除创建表时默认表类型(即永久表)之外,Snowflake 还支持将表定义为临时表或瞬态表。这些类型的表特别适合存储不需要长时间维护的数据(即瞬态数据)。
本主题内容:
临时表¶
Snowflake 支持创建临时表来存储非永久的瞬态数据(例如 ETL 数据、会话特定数据)。临时表仅存在于创建它们的会话中,且仅在会话的剩余时间内持续存在。因此,它们对于其他用户或会话不可见。在会话结束后,表中存储的数据将从系统中完全清除,因此创建该表的用户和 Snowflake 均无法恢复该数据。
备注
除了表之外,Snowflake 还支持创建其他某些数据库对象作为临时对象(例如暂存区)。这些对象遵循相同的语义(即基于会话,仅在会话的剩余时间内持续存在)。
临时表的数据存储使用情况¶
在临时表存在期间,表中存储的数据将计入 Snowflake 向您的账户收取的总存储费用。为防止任何意外存储更改,特别是在维护时间段超过 24 小时的会话中创建大型临时表时,Snowflake 建议在不再需要这些表时显式将其删除。您还可以显式退出创建表的会话,以确保不产生额外费用。
与其他表类型的潜在命名冲突¶
与其他表类型(瞬态表和永久表)类似,临时表属于指定的数据库和架构;但由于它们基于会话,因此不受相同的唯一性要求的约束。这意味着,您可以在同一个架构中创建同名的临时表和非临时表。
但请注意,在同一个架构内,临时表在会话中的优先级高于同名的其他任何表。这可能会导致潜在冲突和意外行为,特别是在临时表和非临时表上执行 DDL 时。例如:
您可以在同一个架构中创建与现有表同名的临时表,这会产生隐藏现有表的效果。
您可以在同一个架构内创建与现有临时表同名的表;但新创建的表会被临时表隐藏。
随后,会话中对表执行的所有查询和其他操作都只会影响临时表。
重要
在删除会话中的表,并在后续使用 Time Travel 恢复该表时,这种行为尤其需要注意。另外,在使用 CREATE OR REPLACE 创建表时也要注意这种行为,因为这实际上会删除一个表(如果存在)并使用指定的定义创建一个新表。
创建临时表¶
要创建临时表,只需在 CREATE TABLE 中指定 TEMPORARY 关键字(或 TEMP 缩写形式)即可。
请注意,创建临时表 不 需要具备在其上创建对象的架构的 CREATE TABLE 特权。
例如:
CREATE TEMPORARY TABLE mytemptable (id NUMBER, creation_date DATE);
备注
创建后,临时表无法转换为其他任何表类型。
瞬态表¶
Snowflake 支持创建瞬态表,这些表将持续存在,直至显式删除为止,并且可供具有适当权限的所有用户使用。瞬态表与永久表类似,主要区别在于它们没有故障安全期。因此,瞬态表专为需要在每个会话之外维护的瞬态数据而设计(与临时表相反),但不需要提供与永久表相同级别的数据保护和恢复。
瞬态表的数据存储使用情况¶
与永久表类似,瞬态表会产生 Snowflake 向您的账户收取的总存储费用;但由于瞬态表不使用故障安全,因此没有故障安全费用(即与维护故障安全灾难恢复所需的数据相关的费用)。
作为永久表克隆创建的瞬态表¶
创建永久表克隆形式的瞬态表时,Snowflake 会创建一个 :ref:` 零拷贝克隆 <label-cloning-tables>`。这意味着在创建瞬态表时,它不会占用任何数据存储,因为它共享原始永久表的所有现有 微分区。在克隆中添加、删除或更新行时,会产生专属于克隆(在本例中为瞬态表)的新微分区。
在永久表删除之后,它会进入 7 天的故障安全状态。故障安全字节会产生 存储费用。如果将瞬态表创建为永久表的克隆,则可能会造成永久表被删除、其所有字节进入故障安全之间的时间延后。如果在删除之时,瞬态表与永久表共享任何微分区,则这些共享字节仅在瞬态表被删除时才会进入故障安全状态。
瞬态数据库和架构¶
Snowflake 还支持创建瞬态数据库和架构。根据定义,在瞬态架构中创建的所有表及在瞬态数据库中创建的所有架构都是瞬态的。
创建瞬态表、架构或数据库¶
要创建瞬态表、架构、数据库,只需在创建对象时指定 TRANSIENT 关键字即可:
例如,要创建瞬态表,请执行以下代码:
CREATE TRANSIENT TABLE mytranstable (id NUMBER, creation_date DATE);
备注
创建后,瞬态表无法转换为其他任何表类型。
表类型的比较¶
下表汇总了三种表类型之间的差异,特别是它们对 Time Travel 和故障安全的影响:
类型 |
永久 |
克隆(源类型 => 目标类型) |
Time Travel |~|保留|~| 期 (天) |
故障安全 期|~| (天) |
---|---|---|---|---|
临时 |
会话剩余时间 |
临时 => 临时 . . 临时 => 瞬态 |
0 或 1(默认为 1) |
0 |
瞬态 |
直至显式删除 |
瞬态 => 临时 . . 瞬态 => 瞬态 |
0 或 1(默认为 1) |
0 |
永久 (Standard Edition) |
直至显式删除 |
永久 => 临时 . . 永久 => 瞬态 . . 永久 => 永久 |
0 或 1(默认为 1) |
7 |
直至显式删除 |
永久 => 临时 . . 永久 => 瞬态 . . 永久 => 永久 |
0 至 90(默认值可配置) |
7 |
Time Travel 备注¶
可在创建表时或创建表之后的任何时间指定表的 Time Travel 保留期。在保留期内,可以对表中的数据和表本身执行所有 Time Travel 操作,例如对表中的数据执行查询,或对表本身执行克隆和恢复。
如果永久表的 Time Travel 保留期设置为 0,则在删除时,它将立即进入故障安全期。
临时表的 Time Travel 保留期可为 1 天;但一旦会话(创建表的会话)结束,临时表就会被清除,因此实际保留期为 24 小时 或 会话的剩余时间,以较短者为准。
长时间运行的 Time Travel 查询会将临时表和瞬态表的清除延后至查询完成。
故障安全备注¶
任何表类型的故障安全期均不可配置。
瞬态表和临时表 没有 故障安全期。因此,在 Time Travel 保留期内不会产生额外的数据存储费用。
重要
临时表没有故障安全期,因此在管理用于存储瞬态数据的超大型表的费用方面,它是一种很好的选择;但在 Time Travel 保留期过后,这些表中的数据将无法恢复。
例如,如果发生系统故障,导致瞬态表被删除或丢失,则在 1 天后,您和 Snowflake 均无法恢复数据。因此,我们建议 仅 将瞬态表用于不需要提供故障保护的数据,或是可在 Snowflake 外部重建的数据。
有关更多信息,请参阅 数据存储注意事项。