数据存储注意事项¶
本主题提供控制与连续数据保护 (CDP) 相关的数据存储成本(尤其是表)的准则和最佳实践。
CDP 包括 Time Travel 和故障安全,是所有 Snowflake 账户均可使用的一套标准功能,无需额外费用。但是,由于您的账户要为账户中创建的表、架构和数据库中存储的所有数据收费,因此根据存储的数据总量和数据存储的时间长度, CDP 确实会对存储成本产生影响。
无论数据处于活动、Time Travel 还是故障安全状态,都将计算存储量并对其收费。由于这些生命周期状态是连续的,受 CDP 保护的更新/删除数据将继续产生存储费用,直到数据离开故障安全状态。
备注
使用 INSERT、 COPY 或 SNOWPIPE 加载数据时,TIME_TRAVEL_BYTES 和 FAILSAFE_BYTES 将产生费用。这是因为小微分区碎片整理会删除小微分区,并创建具有相同数据的新微分区。删除的微分区会导致 TIME_TRAVEL_BYTES 和 FAILSAFE_BYTES。
本主题内容:
监控数据存储¶
您账户的存储(仅限账户管理员)¶
如果已为您分配 ACCOUNTADMIN 角色(即您是 Snowflake 账户的顶级管理员),您可以使用 Snowsight 或 Classic Console 查看整个账户的数据存储:
- Snowsight:
选择 Admin » Cost Management » Consumption。
- Classic Console:
此页面显示您账户的平均数据存储总量,以及所有数据库、内部和命名暂存区以及故障安全中数据存储总量。
有关更多信息,请参阅 探索存储成本。
单个表存储¶
任何具有适当权限的用户都可以查看单个表的数据存储。Snowflake 提供了以下查看表数据存储的方法:
- Classic Console:
- SQL:
执行 SHOW TABLES 命令。
或
查询以下任一内容:
在这三种方法中, TABLE_STORAGE_METRICS 方法提供的信息最为详细,因为它包括 CDP 生命周期以下三种状态下表数据物理存储空间(以字节为单位)的明细:
活动(ACTIVE_BYTES 列)
Time Travel(TIME_TRAVEL_BYTES 列)
故障安全(FAILSAFE_BYTES 列)
该视图还提供一些列,用于区分自有存储和克隆表时出现的引用存储(请参阅下面的章节)。
暂存文件存储(用于数据加载)¶
为支持将数据批量加载到表中,Snowflake 利用暂存区来存储包含待加载数据的文件。Snowflake 支持内部暂存区和外部暂存区。
在 Snowflake 内部暂存区中暂存的数据文件无需支付与 Time Travel 和故障安全相关的额外费用,但实会产生标准数据存储费用。为帮助管理存储成本,Snowflake 建议您监控这些文件,并在加载数据且不再需要这些文件时将其从暂存区中删除。您可以选择在数据加载期间(使用 COPY INTO <table> 命令)或之后(使用 REMOVE 命令)删除这些文件。
有关更多信息,请参阅 数据加载注意事项。
小技巧
定期清除暂存文件还有其他好处,例如提高数据加载性能。
克隆表、架构和数据库¶
Snowflake 的 Zero-Copy Cloning 功能提供了一种便捷的方法来快速获取任何表、架构或数据库的“快照”,并创建最初共享底层存储的该对象的派生副本。这对于创建不会产生任何额外成本的即时备份非常有用(直到对克隆对象进行更改)。
然而,克隆使得计算总存储使用量变得更加复杂,因为每个克隆都有自己单独的生命周期。这表示可以彼此独立地对原始对象或克隆进行更改,并且这些更改通过 CDP 受到保护。
例如,当创建表的克隆时,该克隆不使用任何数据存储,因为它在克隆时共享原始表的所有现有微分区;但是,可以在克隆中独立于原始表添加、删除或更新行。对克隆的每次更改都会产生新的微分区,这些分区由克隆独占并通过 CDP 进行保护。
此外,克隆可以被克隆,对可以创建的克隆的数量或迭代没有限制(例如,您可以创建克隆的克隆的克隆,等等),这会产生 n 级层次结构克隆对象,每个对象都有自己的共享和独立数据存储部分。
表 IDs¶
每个 Snowflake 表都有唯一标识该表的 ID。此外,每个表还与 CLONE_GROUP_ID 关联。如果表没有克隆,则 ID 和 CLONE_GROUP_ID 相同。这些 IDs 显示在 TABLE_STORAGE_METRICS 视图中。
自有存储与引用存储¶
克隆表时,会为原始表分配一个新的 ID 和 CLONE_GROUP_ID。创建克隆表时,两个表中的所有微分区都是完全共享的。与这些微分区关联的存储由克隆组中最旧的表 拥有,克隆 引用 这些微分区。
创建克隆后,克隆组中的两个表都有独立的生命周期,因此对任一表进行的任何 DML 操作都会创建新的微分区,这些微分区为各自的表所拥有。可以使用 TABLE_STORAGE_METRICS 视图中的 RETAINED_FOR_CLONE_BYTES 列查询与这些微分区相关的存储空间。
由于克隆组中的每个表都有独立的生命周期,因此这些表中的存储所有权有时需要转移到克隆组中的其他表。例如,假设一个克隆组包含:
原始表:
克隆至:
克隆至:
T1
»
T2
»
T3
如果 T2 和 T3 共享一些微分区,且 T2 被丢弃,则必须在 T2 进入故障安全状态之前,转移该存储的所有权。在Snowflake中,这种转移发生在微分区退出 Time Travel 状态并进入故障安全状态时。在上述案例中,当 Time Travel 保留期结束时,之前由 T2 拥有的微分区将转移到 T3。
管理短期表的成本¶
CDP 旨在为数据提供长期保护。这些数据通常存储在永久表中。除非在创建时另有说明,否则 Snowflake 中的表均创建为永久表。
在 ETL 或数据建模过程中,可能会创建一些短期表。对于这些表,没有必要承担 CDP 的存储成本。Snowflake 提供两种不同的机制来支持短期表:
临时表
瞬态表
临时表¶
与其他 SQL 数据库类似,临时表仅存在于单个用户会话中,且仅在会话持续时间内存在。Snowflake 临时表没有故障安全功能,Time Travel 保留期只有 0 天或 1 天;但是,Time Travel 保留期会在删除表时结束。
因此,临时表产生的 CDP 费用总额最多为 1 天(如果表被显式弃用或由于终止会话而弃用,费用总额更少)。在此期间,可以在表中执行 Time Travel。
重要
在 Snowflake 中,连接和会话是不同的概念。登录到 Snowflake 时,可以创建一个或多个会话。只有当用户明确终止会话或会话在 4 小时后因未活动而超时的时候,Snowflake 会话才会终止。断开与 Snowflake 的连接不会终止活动会话。因此,Snowflake 会话可能会持续很长时间,在该会话中创建的任何临时表都将继续存在,直到它们被弃用或会话被终止。
为避免临时表产生意外存储成本,Snowflake 建议在会话中根据需要创建临时表,并在不再需要时将其删除。
瞬态表¶
瞬态表是 Snowflake 独有的。它们具有永久表和临时表的特性:
与临时表不同,瞬态表与会话无关;拥有访问该表权限的所有用户都能看到它们。此外,与永久表类似,瞬时表在创建会话后仍会继续存在。
与临时表一样,瞬时表没有故障安全功能,Time Travel 保留期仅为 0 或 1 天。
因此,暂存表产生的 CDP 费用总额最多为 1 天。在此期间,可以在表中执行 Time Travel。
管理大型、高流失表的成本¶
在数据平台中,表通常是 事实 表或 维度 表,它们的使用模式不同,因此具有不同的存储注意事项:
事实表通常非常大,并且流失(行更新或删除)程度很低。对事实表的大多数更改都是插入新数据,或在某些情况下删除旧数据。CDP 是事实表的理想选择,因为它能以极低的存储成本提供全面的数据保护。
维度表具有不同的更新模式。行更新和删除在维度表中更为常见。当表中的一条或多行更新或删除时,存储这些数据的底层微分区就会开始与 CDP 相关的生命周期转换。对于高流失维度表,与 Time Travel 和故障安全数据相关的存储容量可能比活动表存储容量大得多。
对于绝大多数维度表而言,与这些更新相关的 CDP 存储成本是合理的。维度表通常很小,即使经常更新,Snowflake 中的存储成本也不高, CDP 带来的好处远远超过成本。
对于一些大型、高流失维度表,与 CDP 相关的存储成本可能会很高。当对一个表进行多次更新时,所有受影响的微分区都将重新创建,然后通过 CDP 存储生命周期进行转换。
可以通过计算 TABLE_STORAGE_METRICS 视图中 FAILSAFE_BYTES 除以 ACTIVE_BYTES 的比率来识别高流失维度表。任何比率较大的表都被认为是高流失表。由于 Snowflake 中的存储空间成本很低,而且大多数高流失表消耗的总存储空间不大,因此即使比率很高,首选方案也是将这些表创建为永久表,并使用 CDP 保护数据。
在某些情况下,高流失维度表的存储成本过高,您可能更倾向于选择 CDP 以外的替代方案。举个极端的例子,假设一个表中的行与表中的每个微分区相关联(包括 200 GB 物理存储)。如果每条记录每天更新 20 次,该表将消耗以下存储空间:
- 活动:
200 GB
- Time Travel:
4 TB
- 故障安全:
28 TB
- 总存储:
32.2 TB
对于会产生过高 CDP 成本的大型、高流失维度表,解决方案是将这些表创建为 Time Travel 保留期为零的瞬时表(即 DATA_RETENTION_TIME_IN_DAYS=0),然后定期将这些表复制到永久表中。这样就有效地创建了这些表的完整备份。由于每个备份都受 CDP 保护,因此在创建新备份时,可以删除旧备份。
以上面的例子为例,同样是 200 GB、高流失维度表,每天备份一次的存储成本为:
- 活动:
200 GB
- Time Travel:
200 GB
- 故障安全:
1.4 TB
- 备份:
200 GB
- 总存储:
2 TB
小技巧
应根据需要经常执行备份,以确保在数据丢失时完全恢复。对于这些表,Snowflake 建议每天至少备份一次。