1. Snowflake架构与核心对象
Snowflake 的架构与传统数据库最大的不同,在于它把“存储”“计算”“服务”三层彻底解耦。理解这一点,是后续所有数据建模与分析工程工作的地基。本节先建立整体架构认知,再逐一认识虚拟仓库、数据库、模式、表、视图等核心对象,最后完成账户与角色的初始化,为后续章节准备好可用的工作环境。
一、三层解耦:多集群共享数据架构
Snowflake 由三个相互独立、可分别伸缩的层次组成:
- 存储层(Storage Layer):数据以列式压缩格式存放在云对象存储(如 S3、Azure Blob、GCS)中,由 Snowflake 统一管理。存储按实际使用量计费,与计算无关。
- 计算层(Compute Layer):由一组组虚拟仓库(Virtual Warehouse)构成,每个仓库是独立的 MPP 计算集群,负责执行查询、加载、转换。多个仓库可以同时读取同一份存储数据,互不争抢资源。
- 云服务层(Cloud Services Layer):负责元数据管理、查询解析与优化、事务与并发控制、访问权限、安全认证等。它是整个系统的“大脑”。
“多集群共享数据”正是这一架构的直接结果:同一张表的数据只有一份,但可以被多个虚拟仓库同时访问。销售团队的分析仓库与数据工程团队的 ETL 仓库可以并行工作,互不影响,也不会产生数据副本。这解决了传统架构中“计算扩容必须复制数据”的痛点。
二、核心对象:从数据库到视图
在 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;
SHOW WAREHOUSES; 应能看到 WH_BI;执行 SELECT CURRENT_ROLE(), CURRENT_WAREHOUSE(); 应返回 R_ANALYST 和 WH_BI。若返回空或报权限错误,说明 GRANT 语句未正确执行。
四、对象命名与解析规则
Snowflake 中对象的完整限定名是 数据库.模式.对象,例如 SALES_DB.CURATED.FACT_ORDER。如果当前会话已通过 USE DATABASE 和 USE SCHEMA 设定了上下文,则可以省略前缀直接引用对象名。标识符默认不区分大小写,但若使用双引号包裹,则变为区分大小写——这一点在跨工具协作时容易踩坑,建议统一使用大写不加引号的命名风格。