1. Snowflake架构与核心对象

Snowflake 的架构与传统数据库最大的不同,在于它把“存储”“计算”“服务”三层彻底解耦。理解这一点,是后续所有数据建模与分析工程工作的地基。本节先建立整体架构认知,再逐一认识虚拟仓库、数据库、模式、表、视图等核心对象,最后完成账户与角色的初始化,为后续章节准备好可用的工作环境。

一、三层解耦:多集群共享数据架构

Snowflake 由三个相互独立、可分别伸缩的层次组成:

  • 存储层(Storage Layer):数据以列式压缩格式存放在云对象存储(如 S3、Azure Blob、GCS)中,由 Snowflake 统一管理。存储按实际使用量计费,与计算无关。
  • 计算层(Compute Layer):由一组组虚拟仓库(Virtual Warehouse)构成,每个仓库是独立的 MPP 计算集群,负责执行查询、加载、转换。多个仓库可以同时读取同一份存储数据,互不争抢资源。
  • 云服务层(Cloud Services Layer):负责元数据管理、查询解析与优化、事务与并发控制、访问权限、安全认证等。它是整个系统的“大脑”。

“多集群共享数据”正是这一架构的直接结果:同一张表的数据只有一份,但可以被多个虚拟仓库同时访问。销售团队的分析仓库与数据工程团队的 ETL 仓库可以并行工作,互不影响,也不会产生数据副本。这解决了传统架构中“计算扩容必须复制数据”的痛点。

云服务层 Cloud Services 元数据管理 · 查询解析与优化 · 事务与并发控制 · 访问权限 · 安全认证 (无状态、自动伸缩,用户无需管理) 计算层 Compute Layer — 虚拟仓库(Virtual Warehouse) WH_ETL 数据加载与转换 X-Small · 自动挂起 WH_BI BI 报表查询 Medium · 多集群 WH_DS 数据科学探索 Large · 按需启动 存储层 Storage Layer — 云对象存储 列式压缩 · 微分区(Micro-partition)· 单一数据副本 SALES_DB HR_DB RAW_DB 多个仓库共享同一份存储数据,互不争抢

二、核心对象:从数据库到视图

在 Snowflake 中,对象按层级组织:账户 → 数据库 → 模式 → 表/视图。数据库是逻辑容器,模式(Schema)是数据库内的命名空间,表存放实际数据,视图则是基于表或其他视图的查询定义。

表分为几种类型,用途不同:

  • 永久表(Permanent Table):默认类型,支持 Time Travel(最长 90 天)和 Fail-safe,适合生产数据。
  • 临时表(Temporary Table):会话级存在,会话结束即消失,不产生存储费用,适合中间结果。
  • 瞬态表(Transient Table):跨会话存在,但无 Fail-safe,Time Travel 最长 1 天,适合可重建的 ETL 中间层。

视图方面,标准视图只保存查询语句,每次访问时执行;物化视图则预先计算并存储结果,适合对性能敏感的聚合查询,但需要额外存储并自动维护。

三、账户与角色初始化

Snowflake 的权限模型基于 RBAC(基于角色的访问控制)。权限不直接授予用户,而是授予角色,再把角色授予用户。系统预置了五个关键角色:

角色权限范围典型用途
ACCOUNTADMIN账户级全部权限账户配置、计费、安全策略
SECURITYADMIN用户与角色管理创建用户、授予角色
SYSADMIN仓库与数据库对象管理创建仓库、数据库、表
USERADMIN用户与角色创建日常用户维护
PUBLIC默认最小权限所有用户自动拥有

实际工作中,建议不要直接用 ACCOUNTADMIN 做日常操作,而是创建自定义角色并遵循最小权限原则。下面是一段可执行的初始化脚本示例:

-- 1. 使用 SECURITYADMIN 创建角色
USE ROLE SECURITYADMIN;

CREATE ROLE IF NOT EXISTS R_ANALYST;
CREATE ROLE IF NOT EXISTS R_ENGINEER;

-- 2. 建立角色继承:自定义角色继承 SYSADMIN
GRANT ROLE R_ANALYST  TO ROLE SYSADMIN;
GRANT ROLE R_ENGINEER TO ROLE SYSADMIN;

-- 3. 创建用户并授予角色
CREATE USER IF NOT EXISTS U_ALICE
  PASSWORD = 'TempPass_2024!'
  MUST_CHANGE_PASSWORD = TRUE
  DEFAULT_ROLE = R_ANALYST;

GRANT ROLE R_ANALYST TO USER U_ALICE;

-- 4. 使用 SYSADMIN 创建仓库与数据库
USE ROLE SYSADMIN;

CREATE WAREHOUSE IF NOT EXISTS WH_BI
  WAREHOUSE_SIZE = 'MEDIUM'
  AUTO_SUSPEND = 300
  AUTO_RESUME = TRUE
  INITIALLY_SUSPENDED = TRUE;

CREATE DATABASE IF NOT EXISTS SALES_DB;
CREATE SCHEMA IF NOT EXISTS SALES_DB.CURATED;

-- 5. 授予对象权限
GRANT USAGE ON WAREHOUSE WH_BI TO ROLE R_ANALYST;
GRANT USAGE ON DATABASE SALES_DB TO ROLE R_ANALYST;
GRANT USAGE ON SCHEMA SALES_DB.CURATED TO ROLE R_ANALYST;
GRANT SELECT ON ALL TABLES IN SCHEMA SALES_DB.CURATED TO ROLE R_ANALYST;
验证初始化是否成功:切换到 R_ANALYST 角色后执行 SHOW WAREHOUSES; 应能看到 WH_BI;执行 SELECT CURRENT_ROLE(), CURRENT_WAREHOUSE(); 应返回 R_ANALYST 和 WH_BI。若返回空或报权限错误,说明 GRANT 语句未正确执行。
注意:示例中的密码仅为演示,实际部署应使用强密码并通过密钥对或 SSO 认证。AUTO_SUSPEND 设为 300 秒意味着仓库空闲 5 分钟后自动挂起,避免持续计费;AUTO_RESUME 确保有查询时自动唤醒,无需人工干预。

四、对象命名与解析规则

Snowflake 中对象的完整限定名是 数据库.模式.对象,例如 SALES_DB.CURATED.FACT_ORDER。如果当前会话已通过 USE DATABASE 和 USE SCHEMA 设定了上下文,则可以省略前缀直接引用对象名。标识符默认不区分大小写,但若使用双引号包裹,则变为区分大小写——这一点在跨工具协作时容易踩坑,建议统一使用大写不加引号的命名风格。