创建混合表¶
本主题概述了如何在 Snowflake 中创建 混合表。
备注
要创建混合表,您必须有一个正在运行的仓库,且该仓库被指定为会话的当前仓库。如果在创建混合表时未指定正在运行的仓库,则可能会发生错误。有关更多信息,请参阅 使用仓库。
CREATE HYBRID TABLE 选项¶
您可以使用以下方法之一,通过 SQL 命令创建混合表:
CREATE HYBRID TABLE。此示例创建一个混合表,在其中插入一些行、删除一行,然后查询该表:
CREATE OR REPLACE HYBRID TABLE icecream ( id NUMBER PRIMARY KEY AUTOINCREMENT START 1 INCREMENT 1, col1 VARCHAR NOT NULL, col2 VARCHAR NOT NULL ); INSERT INTO icecream VALUES(1, 'A1', 'B1'); INSERT INTO icecream VALUES(2, 'A2', 'B2'); INSERT INTO icecream VALUES(3, 'A3', 'B3'); INSERT INTO icecream VALUES(4, 'A4', 'B4'); UPDATE icecream SET col2 = 'B3-updated' WHERE id = 3; DELETE FROM icecream WHERE id = 4; SELECT * FROM icecream;
CREATE HYBRID TABLE ...AS SELECT (CTAS) 或 CREATE HYBRID TABLE ...LIKE。例如:
CREATE OR REPLACE HYBRID TABLE table1 ( employee_id INT PRIMARY KEY, department_id VARCHAR(200) ) AS SELECT * FROM table2;
加载数据¶
备注
由于混合表的主存储是行存储,因此混合表的存储占用空间通常比标准表大。造成差异的主要原因是标准表的列数据通常可实现更高的压缩率。有关存储费用的详细信息,请参阅 评估混合表的成本。
已优化批量负载¶
您可以通过从数据暂存区或其他表复制数据,来将数据批量加载到混合表中(使用 CTAS、COPY INTO <table> 或 INSERT INTO ...SELECT)。
批量加载的优化取决于表是否为空。在这种情况下,只有从未加载过记录的表才被视为空表。已删除行的现有表不会被视为空表。刚刚创建但尚未以任何方式加载的表,或正在创建并通过 CTAS 加载的表,是真正的空表。
当混合表为空时,所有三种加载方法(CTAS、COPY 和 INSERT INTO...SELECT)使用优化的批量加载,这是一种将数据插入混合表的快速执行模式。
目前,当混合表不为空时,不会使用优化的批量加载。仍然可以执行具有 COPY 和 INSERT INTO ...SELECT 操作的增量批量加载,但通常效率较低。您应该能看到每分钟约 100 万条记录的加载速度,但请注意,这一估计值取决于表的结构(例如,记录越大,加载速度越慢)。如果加载、更新和合并耗时过长且失败,请使用较小的数据集进行测试,或将这些操作分成较小的块。优化的批量加载功能将在今后的版本中扩展到支持增量批量加载。
您可以在 Snowsight 中检查查询配置文件中的 Statistics 信息,查看是否使用了批量加载快速路径。在使用快速路径时,Number of rows inserted 称为 Number of rows bulk loaded。例如,CTAS 操作将 200000 行批量加载到一个新表中:

随后对同一表的增量批量加载不会使用优化的批量加载。
有关查询配置文件的更多信息,请参阅 分析混合表的查询配置文件 和 使用 Query History 监控查询活动。
注意
CTAS 命令不支持 FOREIGN KEY 约束。如果您的混合表需要 FOREIGN KEY 约束,请使用 COPY 或 INSERT INTO ... SELECT 加载表。
备注
目前不支持通过其他方法(例如 Snowpipe)将数据加载到 Snowflake 表中。
为混合表添加索引¶
在创建混合表时,您可以定义键、索引和约束。例如:
CREATE OR REPLACE HYBRID TABLE target_hybrid_table (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0) UNIQUE,
col3 NUMBER(38,0),
INDEX index_col3 (col3)
)
AS SELECT col1, col2, col3 FROM source_table);
(可选)您可以使用 CREATE INDEX 为现有混合表创建索引。使用此命令可向正在活跃用于工作负载、正在处理查询或具有外键的混合表添加索引。CREATE INDEX 将并发构建索引,并且不会在操作过程中锁定表。
但如果您的混合表应用程序处于开发或测试模式中,并且一定的停机时间不会给表造成问题,那么通过运行优化的批量加载来重新创建混合表和创建索引会更有效,这比使用 CREATE INDEX 命令在线构建索引更有效。
CTAS、COPY 和 INSERT INTO ...SELECT 支持优化的批量加载,但如果表有 FOREIGN KEY 约束,则不能使用 CTAS。在此示例中创建的第二个表 fk_hybrid_table
必须使用 COPY 或 INSERT INTO...SELECT:
CREATE OR REPLACE HYBRID TABLE ref_hybrid_table (
col1 VARCHAR(32) PRIMARY KEY,
col2 INT UNIQUE);
CREATE OR REPLACE HYBRID TABLE fk_hybrid_table (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0),
col3 NUMBER(38,0),
FOREIGN KEY (col2) REFERENCES ref_hybrid_table(col2),
INDEX index_col3 (col3)
);
所有混合表都需要唯一主键。混合表中的数据会按此主键排序。您可以为非主键属性添加其他二级索引,以加快根据这些属性查找的速度。为了减少要扫描的记录数,可以为 =
、>
、>=
、<
, <=
和 IN 谓词利用索引。
注意
若要添加二级索引,您必须使用已获授混合表 SELECT 权限的角色。如果您有权访问混合表中的数据视图,但没有访问表本身的权限,则无法添加二级索引。
如果对特定属性或复合属性组的谓词执行通用的重复查询,请考虑向该属性或属性组添加索引以提高性能。但在使用索引时,请注意以下事项:
在索引中存储数据子集的额外副本时,存储消耗量会增加。
由于索引是同步维护的,DMLs 的开销会增加。
加载过程中的索引构建错误¶
当基于混合表中的列构建索引时,尤其是基于大量列的索引时,加载表的任何命令(包括 CTAS、COPY 或 INSERT INTO ... SELECT)可能会返回以下错误:
The value is too long for index "IDX_HT100_COLS".
在此示例中,IDX_HT100_COLS
是正在创建的表的索引的名称。
出现此错误的原因是,基于行的存储对每条记录可存储的数据(和元数据)的大小施加了限制。若要减小记录大小,请尝试在不指定较大列(如宽 VARCHAR 列)作为索引列。
您还可以尝试使用 INCLUDE 列,而不是直接为列编制索引。有关简单示例,请参阅 创建一个带有 INCLUDE 列的二级索引.