创建混合表

本主题概述了如何在 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;
    
    Copy
  • 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;
    
    Copy

加载数据

备注

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

您可以通过从数据暂存区或其他表复制数据,来将数据批量加载到混合表中(即使用 CTAS、COPY 或 INSERT INTO ...SELECT),但是强烈建议使用 CTAS 语句将数据批量加载到混合表。使用 CTAS 批量加载针对性能进行了优化,在大多数情况下,使大负载(数百万条记录)的运行速度比其他选项快约 10 倍。

此外还支持通过 INSERT 或 COPY 批量加载数据,但如果数据量较大,通过这两种方式加载数据的速度较慢。在加载大型数据集时,您可能需要等待较长的时间,甚至会发生超时。对最近加载的数据执行的查询也会变慢。我们计划在不久的将来针对 DML 语句(如 COPY)优化批量加载。

注意

CTAS 命令不支持外键约束。如果必须在混合表中使用外键约束,请使用其他加载选项,如 COPY 或 INSERT INTO ...SELECT。

如果您的源数据存在于外部暂存区而不是 Snowflake 表中,请使用以下语法:

CREATE TABLE ... AS SELECT * FROM @stage/data.csv
Copy

避免使用以下语法:

COPY FROM @stage/data.csv
Copy

CTAS 选项是更高效的加载方法。

当您 使用 CTAS 时,您每分钟应该最多能加载大约 100 万条记录。不过请注意,此值仅为近似值,具体取决于表的结构(例如,记录的大小,越大的记录加载速度越慢)。如果加载操作花费的时间过长,并且加载失败,请使用较小的数据集进行测试,或者将加载内容拆分为多个较小的块。

当基于混合表中的列构建索引时,尤其是基于大量列的索引时,加载表的任何命令(包括 CTAS、COPY 或 INSERT INTO ...SELECT)可能会返回以下错误:

The value is too long for index "IDX_HT100_COLS".

其中 IDX_HT100_COLS 是正在创建的表的索引的名称。

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

您还可以尝试使用 INCLUDE 列,而不是直接为列编制索引。有关简单示例,请参阅 创建一个带有 INCLUDE 列的二级索引.

备注

目前不支持通过其他方法(例如 Snowpipe)将数据加载到 Snowflake 表中。

为混合表添加索引

在创建混合表时,您可以定义键、索引和约束。例如:

CREATE OR REPLACE HYBRID TABLE targethybridtable (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0) UNIQUE,
    col3 NUMBER(38,0),
    INDEX index_col3 (col3)
    )
  AS SELECT col1, col2, col3 FROM sourcetable);
Copy

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

但如果您的混合表应用程序处于开发或测试模式,并且一定的停机时间不会给表造成问题,则在 CTAS 命令内创建索引。CTAS 命令提供的批量加载快速路径比使用 CREATE INDEX 命令构建在线索引更高效。

混合表需要唯一主键。表中的数据会按此主键排序。您可以为非主键属性添加其他二级索引,以加快根据这些属性查找的速度。为了减少要扫描的记录数,可以为 =>>=<, <= 和 IN 谓词利用索引。

注意

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

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

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

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

语言: 中文