跳至主要内容

在 Snowflake 中创建表:类型、示例与最佳实践

了解如何在 Snowflake 中创建不同类型的表,包括永久表、临时表、外部表和动态表。包含分步示例与最佳实践。
· 9分钟 阅读

使用 AI 探索

Snowflake 是一款功能强大的云端数据仓库平台,帮助组织高效地存储、管理和分析数据。与需要复杂硬件部署的传统数据仓库不同,Snowflake 完全运行在云端,使企业能够根据需要更轻松地扩展数据业务。

在 Snowflake 中创建表是一项奠基性的技能,是数据管理的基础。表是您存放结构化数据的地方,便于运行查询、生成报表,并从信息中获得有价值的洞见。无论您处理的是客户数据、销售数据,还是分析结果,掌握如何在 Snowflake 中创建和管理表都至关重要。

在本教程中,您将学习在 Snowflake 中创建表所需的一切。我们将介绍不同类型的表,提供分步示例,并分享表设计的最佳实践。结束后,您将能够自信地选择适合自己需求的表类型,并创建符合行业标准、兼顾性能与可维护性的表。

了解 Snowflake 中的表类型

在深入讲解创建表的代码示例之前,先来了解 Snowflake 中的不同表类型。它们分别服务于不同目的,并在数据持久性、可访问性与存储位置等方面具有各自的特性。

永久表

永久表是 Snowflake 中的标准表类型。它们会一直存在,直到被显式删除,并存储在 Snowflake 的内部存储中。此类表非常适合存放需要长期保留、并在多个会话中访问的核心业务数据。永久表中的数据在会话之间保持不变,授权用户均可访问。

临时表

临时表是会话级表,会在当前会话结束时自动删除。它们可用作中间处理步骤的工作表,帮助组织复杂的数据转换,同时不占用永久存储。临时表中的数据仅对创建它们的会话可见,并在会话关闭时自动清理。

外部表

外部表提供一种查询 Snowflake 存储之外数据的方式。它们充当元数据层,映射到诸如 AWS S3 或 Azure Blob Storage 等外部存储位置中的数据。外部表不会摄取数据,而是创建数据引用,使您能够直接查询外部数据。当需要让数据保留在源位置,或需要频繁从外部系统更新时,这种方式尤为有价值。

动态表

动态表是 Snowflake 中一项强大的功能,可自动维护查询结果的最新状态。它们类似于物化视图,会根据底层源表的变化自动刷新。当您创建动态表时,通过一个 SELECT 语句进行定义,Snowflake 会自动管理刷新过程,确保数据保持最新。

动态表特别适用于:

  • 构建无需手动刷新的实时仪表板
  • 维护会自动更新的源数据汇总或转换版本
  • 创建依赖型数据模型,使下游表能反映上游变更
  • 通过预计算复杂转换来优化查询性能

动态表的关键特性包括:

  • 可配置的刷新间隔(1 分钟至 24 小时)
  • 对源表的自动依赖跟踪
  • 目标滞后时间设置以控制数据新鲜度
  • 增量处理以尽量降低计算成本
  • 内置监控与优化能力

每种表类型在数据架构中都有其独特用途。永久表构筑数据仓库的基础,临时表支持数据处理工作流,外部表实现与外部数据源的集成,动态表提供自动化、近实时的数据转换。

对比 Snowflake 表类型 

下表为不同类型的 Snowflake 表提供了简明的速查对照:

Table Type

Persistence

Visibility

Best For

Permanent

Until dropped

Any session

Core business data

Temporary

Session-only

Same session

Intermediate transformations

External

External storage

Any session

Querying external data (e.g., S3)

Dynamic

Auto-refreshing

Any session

Real-time analytics

创建表:设置 Snowflake 环境

在运行本教程中的示例之前,您需要访问一个 Snowflake 环境。以下是连接并运行 Snowflake 命令的几种方式:

1. Snowflake 网页界面(Snowsight)

最简单的上手方式是通过 Snowflake 的网页界面:

  1. 登录您的 Snowflake 账户
  2. 进入 Worksheets
  3. 创建新工作表以运行 SQL 命令

2. Snowflake CLI(命令行工具)

若需命令行访问:

  1. 安装 Snowflake CLI
  2. 使用以下方式连接:
snowsql -a <account> -u <username> -d <database> -w <warehouse>

您可以在以下位置找到 Snowflake 账户凭据:

  1. 账户 URL:在欢迎邮件或账户设置中查看
  2. 用户名:在账户设置期间提供
  3. 数据库:由您的管理员创建或分配
  4. 仓库(Warehouse):由您的管理员创建或分配

出于安全考虑,切勿共享或提交这些凭据。请将其安全地存储在环境变量或配置文件中。

3. Python 连接

如果您使用 Python,可以使用 snowflake-connector-python 库:

import snowflake.connector

conn = snowflake.connector.connect(
   user='your_username',
   password='your_password',
   account='your_account',
   warehouse='your_warehouse',
   database='your_database',
   schema='your_schema'
)

cur = conn.cursor()

cur.execute("SELECT current_version()")

重要的安全提示:

  • 切勿将凭据直接存放在代码中
  • 使用环境变量或安全的密钥管理
  • 生产环境建议使用密钥对认证
  • 遵循您组织的安全策略

环境就绪后,让我们开始创建表!

在 Snowflake 中创建表:分步示例

示例 1:创建一个简单的 Snowflake 表

我们来创建一个用于存储客户信息的表。该示例展示了包含不同数据类型与约束的基础建表方式。

-- Create a permanent table for customer data
CREATE OR REPLACE TABLE customers (
   customer_id INTEGER PRIMARY KEY,
   first_name VARCHAR(50) NOT NULL,
   last_name VARCHAR(50) NOT NULL,
   email VARCHAR(100) UNIQUE,
   date_of_birth DATE,
   created_at TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP()
);

此示例的要点:

  • CREATE OR REPLACE TABLE —— 创建新表,若已存在则替换
  • PRIMARY KEY —— 确保每条记录唯一标识
  • NOT NULL —— 禁止必填字段为空
  • UNIQUE —— 确保邮箱地址不重复
  • TIMESTAMP_NTZ —— 不含时区的时间戳
  • DEFAULT —— 自动设置创建时间戳

示例 2:创建临时表

临时表非常适合中间数据处理。以下示例创建一个用于分析客户订单的临时表:

-- Create a temporary table for order analysis
CREATE OR REPLACE TEMPORARY TABLE temp_order_analysis (
   order_date DATE,
   total_orders INTEGER,
   total_revenue DECIMAL(18,2)
)
AS
SELECT
   DATE_TRUNC('day', order_date) as order_date,
   COUNT(*) as total_orders,
   SUM(order_amount) as total_revenue
FROM orders
GROUP BY 1;

关于临时表的要点:

  • TEMPORARY 关键字表示该表仅在当前会话内存在。这意味着其他用户无法查看或访问此表。
  • 使用 CREATE TABLE AS(CTAS)可将表定义与 SELECT 语句结合,在一步内创建并填充表。
  • 会话结束时临时表会自动删除,有助于在无需手动清理的情况下保持数据库整洁。
  • 临时表适合在复杂的数据转换或分析流程中存放中间结果。

示例 3:在 Snowflake 中创建外部表 

以下示例展示如何创建一个从云存储桶中的文件读取数据的外部表:

-- Create file format for CSV files
CREATE OR REPLACE FILE FORMAT my_csv_format
   TYPE = CSV
   FIELD_DELIMITER = ','
   SKIP_HEADER = 1
   NULL_IF = ('NULL', 'null');

-- Create external stage
CREATE OR REPLACE STAGE my_external_stage
   URL = 's3://my-bucket/data/'
   CREDENTIALS = (AWS_KEY_ID = 'xxx' AWS_SECRET_KEY = 'xxx');

-- Create external table
CREATE OR REPLACE EXTERNAL TABLE ext_customer_data (
   customer_id VARCHAR AS (VALUE:c1::VARCHAR),
   purchase_date DATE AS (VALUE:c2::DATE),
   product_id VARCHAR AS (VALUE:c3::VARCHAR),
   amount DECIMAL(10,2) AS (VALUE:c4::DECIMAL(10,2))
)
WITH LOCATION = @my_external_stage/customers/
FILE_FORMAT = my_csv_format
PATTERN = '.*[.]csv';

第一条语句定义了文件格式规范,告知 Snowflake 如何解析外部 CSV 文件,包括分隔符、表头处理以及 NULL 值表示。

第二条语句创建了一个 stage 对象,使用所提供的凭据与外部云存储(此处为 S3)建立连接。该 stage 充当访问外部数据文件的参照点。

第三条语句创建外部表本身,使用带 AS 子句的列定义,将来自 CSV 的原始字符串数据显式转换为合适的 Snowflake 数据类型。WITH LOCATION 子句指向 stage 内文件所在的具体路径。

PATTERN 参数通过正则匹配筛选应包含的文件,确保仅处理 CSV 文件。

运行此外部表创建语句的先决条件:

1. 访问具有以下权限的 Snowflake 账户:

  • 创建文件格式
  • 创建 stage
  • 创建外部表

2. 具备有效的 AWS 凭据(AWS_KEY_ID 与 AWS_SECRET_KEY),并拥有以下权限:

  • 读取目标 S3 存储桶
  • 列出存储桶中的对象

3. 源数据要求:

  • CSV 文件存放在 S3 存储桶中
  • 文件遵循包含四列的一致格式
  • 列数据与指定类型匹配:
  • customer_id 为字符串
  • purchase_date 为日期
  • product_id 为字符串
  • amount 为十进制数

4. 网络连通性:

  • 可访问 AWS S3 的网络
  • 正确的安全组与防火墙设置

5. 计算资源:

  • 有足够计算能力的活跃仓库
  • 充足的用户点数/配额

示例 4:创建动态表

以下示例创建一个动态表,用于维护销售数据的最新汇总:

-- Create a dynamic table for real-time sales analytics
CREATE OR REPLACE DYNAMIC TABLE daily_sales_summary
TARGET_LAG = '20 minutes'
WAREHOUSE = 'COMPUTE_WH'
AS
SELECT
   DATE_TRUNC('day', sale_timestamp) as sale_date,
   product_category,
   SUM(sale_amount) as total_sales,
   COUNT(DISTINCT customer_id) as unique_customers
FROM sales_transactions
GROUP BY 1, 2;

TARGET_LAG 参数设置为 “20 minutes”,表示从源表更新到动态表反映变更的最大允许延迟。这确保了在该时间窗口内的数据新鲜度。

WAREHOUSE 参数指定用于定期刷新动态表的计算资源(此处为 COMPUTE_WH)。该仓库必须具备足够的能力来处理刷新操作。

当底层的 sales_transactions 表发生变化时,动态表会自动更新其内容,无需人工干预。这提供了近实时的分析能力。

通过按产品类别维护预聚合的每日销售汇总,动态表相比从原始交易数据按需计算这些指标,能够更快地查询。这提升了报告与分析场景的查询性能。

上述每个示例展示了您在真实应用中可能遇到的不同建表场景。请根据具体需求调整列名、数据类型与其他参数。

在 Snowflake 中创建表的最佳实践

下面来看看在 Snowflake 中创建表时应遵循的一些最佳实践,以确保可维护性、性能与数据质量。

1. 命名规范

始终为表与列使用清晰、一致的名称:

-- Good naming examples
CREATE TABLE customer_orders (
   order_id INTEGER,
   customer_email VARCHAR,
   order_date DATE
);

-- Bad naming examples
CREATE TABLE Orders123 (
   ID INTEGER,
   email VARCHAR,
   dt DATE
);

命名提示:

  • 使用小写字母与下划线(snake_case)
  • 避免空格与特殊字符
  • 名称应具描述性但不宜过长
  • 表名使用单数形式(如 customer 而非 customers)
  • 为不同环境添加前缀(dev_、test_、prod_)

2. 列的数据类型

选择合适的数据类型可节省存储并提升性能:

-- Good data type choices
CREATE TABLE products (
   product_id INTEGER,
   price DECIMAL(10,2),    -- For money values
   name VARCHAR(100),      -- Set a reasonable limit
   description TEXT,       -- For very long text
   is_active BOOLEAN      -- Instead of VARCHAR or INTEGER
);

常用数据类型:

  • NUMBER/INTEGER:用于整数
  • DECIMAL/NUMERIC:用于精确的小数(尤其是金额)
  • VARCHAR:用于有已知最大长度的文本
  • TEXT:用于无限长度文本
  • TIMESTAMP_NTZ:用于日期与时间(无时区)
  • BOOLEAN:用于布尔值

3. 使用聚簇键(Clustering Keys)

添加聚簇键以提升查询性能:

CREATE TABLE sales (
   sale_date DATE,
   store_id INTEGER,
   product_id INTEGER,
   amount DECIMAL(10,2)
)
CLUSTER BY (sale_date, store_id);

何时使用聚簇:

  • 对于大型表(超过 100 万行)
  • 在经常用于过滤或关联的列上
  • 通常是日期列加上 1–2 个其他列
  • 不要在基数过高的列上进行聚簇

4. 添加表约束

使用约束保持数据整洁:

CREATE TABLE users (
   user_id INTEGER PRIMARY KEY,  -- Ensures unique IDs
   email VARCHAR(255) UNIQUE,    -- No duplicate emails
   username VARCHAR(50) NOT NULL, -- Must have a value
   age INTEGER CHECK (age >= 18) -- Must be 18 or older
);

重要的约束:

  • PRIMARY KEY:用于唯一标识符
  • FOREIGN KEY:用于连接表之间的关系
  • NOT NULL:用于必填字段
  • UNIQUE:用于不允许重复的字段
  • CHECK:用于简单的数据校验

5. 常见错误避免

不要这样做:

-- Bad practice: No primary key
CREATE TABLE orders (
   date VARCHAR,           -- Wrong data type for dates
   amount VARCHAR(10),     -- Wrong data type for numbers
   status text            -- Inconsistent case with other columns
);

推荐这样做:

-- Good practice
CREATE TABLE orders (
   order_id INTEGER PRIMARY KEY,
   order_date DATE,
   amount DECIMAL(10,2),
   status VARCHAR(20)
);

改进版本通过主键确保数据完整性,正确使用日期与数字的数据类型以支持高效过滤与计算,并在列定义上保持一致性,从而提升可读性与兼容性。

6. 性能提示

在 Snowflake 中优化表的性能可显著提升查询速度并降低存储成本。遵循以下最佳实践,确保您的表高效且可扩展。

  • 尽量将超大表拆分为更小的专题表
  • 使用 COMMENT 添加列描述
  • 设置自动数据清理规则
  • 用真实数据验证您的表设计
  • 监控表的使用情况并按需调整

7. 安全最佳实践

完善的安全措施对于保护敏感数据与控制访问至关重要。实施以下最佳实践,以防止未授权访问和数据泄露,保障您的 Snowflake 环境安全。

  • 始终设置合适的访问权限
  • 按需使用行级安全
  • 加密敏感列
  • 清楚记录各类访问权限
  • 定期审查访问模式

请记住:一个设计良好的表会让后续工作事半功倍。创建之前务必花时间规划表结构!

结语

本教程涵盖了在 Snowflake 中创建表的要点,包括:

  • 不同类型的表(永久表、临时表、外部表与动态表)
  • 为每种表提供的分步创建示例
  • 表设计与管理的最佳实践
  • 需要避免的常见陷阱

这些知识为您在 Snowflake 中构建高效且可扩展的数据解决方案打下了基础。

后续学习

如需进一步提升 Snowflake 技能,请查看以下资源:

1. 互动课程:

2. 系统教程:

3. 职业发展资源:

别忘了,最好的学习方式就是实践。开始创建表,尝试不同类型,并构建真实项目。遇到挑战时,回看这些资源并持续探索 Snowflake 的新功能。

Snowflake 创建表常见问答

Snowflake 中有哪些不同类型的表?

Snowflake 支持四种主要表类型:用于长期数据存储的永久表、用于会话内使用的临时表、用于查询外部数据源的外部表,以及用于自动维护查询结果的动态表。

如何在 Snowflake 中创建一个基础表?

使用 CREATE TABLE 命令并指定所需的模式。例如:"CREATE TABLE customers (customer_id INTEGER PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50))"。请包含合适的数据类型和约束。

什么是 Snowflake 中的动态表,应在何时使用?

动态表会自动维护查询结果的最新状态,类似于物化视图。它非常适合实时仪表板、自动化数据转换,以及需要频繁更新的聚合数据维护。

在 Snowflake 中给表命名的最佳实践是什么?

使用小写加下划线(snake_case),避免空格和特殊字符,名称应简洁且具描述性,表名使用单数形式,并考虑添加环境前缀(dev_、test_、prod_)。

如何提升 Snowflake 中表的性能?

通过使用合适的聚簇键、正确选择数据类型、设置恰当的约束、创建更小且聚焦的表而非超大表,并定期监控表的使用模式来提升性能。

Bexruz (Bex) Tuychiev

作者

Bexruz (Bex) Tuychiev

我是一名数据科学内容创作者,拥有超过 2 年的经验,并在 Medium 上拥有较大的读者群。我喜欢用略带讽刺的笔调撰写有关 AI 和机器学习的深度文章——毕竟总得想点办法让这些内容不那么枯燥。我已发表 130 多篇文章,并制作了一门 DataCamp 课程,另有一门正在筹备中。我的内容已被超过 500 万人次阅读,其中有 2 万人在 Medium 和 LinkedIn 上成为关注者。 

主题