创建混合表

本主题概述了如何在 Snowflake 中创建 混合表

备注

要创建混合表,您必须有一个正在运行的仓库,且该仓库被指定为会话的当前仓库。如果在创建混合表时未指定正在运行的仓库,则可能会发生错误。有关更多信息,请参阅 使用仓库

CREATE HYBRID TABLE 选项

您可以使用以下方法之一创建混合表:

  • CREATE HYBRID TABLE。以下示例创建一个包含所需的 PRIMARY KEY 约束的混合表,插入一些行,删除一行,然后查询表:

    CREATE OR REPLACE HYBRID TABLE application_log (
      id NUMBER PRIMARY KEY AUTOINCREMENT,
      col1 VARCHAR(20),
      col2 VARCHAR(20) NOT NULL
      );
    
    INSERT INTO application_log (col1, col2) VALUES ('A1', 'B1');
    INSERT INTO application_log (col1, col2) VALUES ('A2', 'B2');
    INSERT INTO application_log (col1, col2) VALUES ('A3', 'B3');
    INSERT INTO application_log (col1, col2) VALUES ('A4', 'B4');
    
    SELECT * FROM application_log;
    
    UPDATE application_log SET col2 = 'B3-updated' WHERE id = 3;
    
    DELETE FROM application_log WHERE id = 4;
    
    SELECT * FROM application_log;
    
    Copy
  • CREATE HYBRID TABLE ...AS SELECT (CTAS)CREATE HYBRID TABLE ... LIKE。例如:

    CREATE OR REPLACE HYBRID TABLE dept_employees (
      employee_id INT PRIMARY KEY,
      department_id VARCHAR(200)
      )
    AS SELECT employee_id, department_id FROM company_employees;
    
    Copy

加载数据

备注

由于混合表的主存储是行存储,因此混合表的存储占用空间通常比标准表大。造成差异的主要原因是标准表的列数据通常可实现更高的压缩率。有关存储费用的详细信息,请参阅 评估混合表的成本

已优化批量负载

您可以通过从数据暂存区或其他表复制数据,来将数据批量加载到混合表中(使用 CTASCOPY INTO <table>INSERT INTO ...SELECT)。

批量加载的优化取决于表是在未加载任何记录的情况下新建,还是使用 CTAS 查询创建。

当混合表为空时,所有三种加载方法(CTAS、COPY 和 INSERT INTO...SELECT)使用优化的批量加载来加快加载过程。加载表后,正常 INSERT 性能适用。您仍然可以使用 COPY 和 INSERT INTO ...SELECT 操作运行增量批量加载,但效率通常较低。批量加载速度经常为每分钟大约 100 万条记录,但可能因表的结构而有很大差异(例如,记录越大,加载速度越慢)。优化的批量加载将得到扩展,以支持未来版本中的增量批量加载。

您可以在 Snowsight 查询配置文件中检查 Statistics 信息,看看是否使用了批量加载快速路径。在使用快速路径时,Number of rows inserted 称为 Number of rows bulk loaded。例如,CTAS 操作将 200000 行批量加载到一个新表中:

使用优化批量加载的 CTAS 查询配置文件

随后对同一表的增量批量加载不会使用优化的批量加载。

有关查询配置文件的更多信息,请参阅 分析混合表的查询配置文件使用 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;
Copy

(可选)您可以使用 CREATE INDEX 为现有混合表创建索引。使用此命令可向正在活跃用于工作负载、正在处理查询或具有外键的混合表添加索引。CREATE INDEX 将并发构建索引,并且不会在操作过程中锁定表。

备注

使用 SHOW INDEXES 命令检查索引构建状态。每次仅支持一个索引构建。

但如果您的混合表应用程序处于开发或测试模式中,并且一定的停机时间不会给表造成问题,那么通过运行优化的批量加载来重新创建混合表和创建索引会更有效,这比使用 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 NUMBER(38,0) 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)
);
Copy

所有混合表都需要唯一主键。混合表中的数据会按此主键排序。您可以为非主键属性创建其他二级索引,以加快根据这些属性查找的速度。当查询谓词使用以下条件之一时,索引可能减少扫描的记录数:

注意

若要添加二级索引,您必须使用已获授混合表 SELECT 权限的角色。如果您有权访问混合表中的数据视图,但没有访问表本身的权限,则无法添加二级索引。

如果对特定属性或复合属性组的谓词执行通用的重复查询,请考虑向该属性或属性组添加索引以提高性能。但在使用索引时,请注意以下事项:

  • 在索引中存储数据子集的额外副本时,存储消耗量会增加。

  • 由于索引是同步维护的,DMLs 的开销会增加。

加载过程中的索引构建错误

索引大小的宽度受到限制。在混合表中的列上构建索引时,尤其是大量列的索引,任何加载表的命令(包括 CTAS、COPY 或 INSERT INTO ... SELECT)都可能会返回以下错误。在本例中,该表包含一个名为 IDX_HT100_COLS 的索引:

The value is too long for index "IDX_HT100_COLS".

出现此错误的原因是,基于行的存储对每条记录可存储的数据(和元数据)的大小施加了限制。要减小记录大小,请尝试在不指定较大列(如宽 VARCHAR 列)作为索引列。您还可以尝试在较少的列上创建索引。

在创建表时,您还可以尝试在二级索引上使用 INCLUDE 列。有关简单示例,请参阅 创建一个带有 INCLUDE 列的二级索引.(在创建混合表时支持 INCLUDE 列,但在使用 CREATE INDEX 命令创建索引时不支持。)

语言: 中文