Databend 免拷贝数据共享(Copy-Free Data Sharing)的工作原理
什么是数据共享(Data Sharing)?
不同团队需要相同数据的不同部分。传统解决方案会多次复制数据——成本高昂且难以维护。
Databend 的 ATTACH TABLE 优雅地解决了这个问题:为相同数据创建多个"视图"(View)而无需复制。这利用了 Databend 的真正计算存储分离架构——无论使用云存储还是本地对象存储:存储一次,随处访问。
可以将 ATTACH TABLE 想象成计算机快捷方式——它们指向原始文件而不复制它。
对象存储(Object Storage)(S3, MinIO, Azure, 等)
┌─────────────┐
│ 您的数据 │
└──────┬──────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 营销团队 │ │ 财务团队 │ │ 销售团队 │
│ 视图 │ │ 视图 │ │ 视图 │
└─────────────┘ └─────────────┘ └─────────────┘
如何使用 ATTACH TABLE
步骤 1:查找数据位置
SELECT snapshot_location FROM FUSE_SNAPSHOT('default', 'company_sales');
-- 结果:1/23351/_ss/... → 数据位于 s3://your-bucket/1/23351/
步骤 2:创建团队特定视图
-- 营销:客户行为分析
ATTACH TABLE marketing_view (customer_id, product, amount, order_date)
's3://your-bucket/1/23351/' CONNECTION = (ACCESS_KEY_ID = 'xxx', SECRET_ACCESS_KEY = 'yyy');
-- 财务:收入跟踪
ATTACH TABLE finance_view (order_id, amount, profit, order_date)
's3://your-bucket/1/23351/' CONNECTION = (ACCESS_KEY_ID = 'xxx', SECRET_ACCESS_KEY = 'yyy');
-- 人力资源:不包含薪资的员工信息
ATTACH TABLE hr_employees (employee_id, name, department)
's3://data/1/23351/' CONNECTION = (...);
-- 开发:不包含敏感数据的生产结构
ATTACH TABLE dev_customers (customer_id, country, created_date)
's3://data/1/23351/' CONNECTION = (...);
步骤 3:独立查询
-- 营销分析趋势
SELECT product, COUNT(*) FROM marketing_view GROUP BY product;
-- 财务跟踪利润
SELECT order_date, SUM(profit) FROM finance_view GROUP BY order_date;
主要优势
实时更新:当源数据更改时,所有附加表立即看到变化
INSERT INTO company_sales VALUES (1001, 501, 'Laptop', 1299.99, 299.99, 'user@email.com', '2025-01-20');
SELECT COUNT(*) FROM marketing_view WHERE order_date = '2024-01-20'; -- 返回:1
列级安全性:团队只能看到需要的内容——营销看不到利润,财务看不到客户邮箱
强一致性:永远不会读取部分更新,始终看到完整快照——非常适合财务报告和合规性
完整性能:所有索引(Index)自动工作,与常规表相同的速度
为什么这很重要
传统方法 | Databend ATTACH TABLE |
---|---|
多个数据副本 | 所有人共享单个副本 |
ETL 延迟,同步问题 | 实时,始终最新 |
复杂维护 | 零维护 |
更多副本 = 更多安全风险 | 细粒度列访问 |
由于数据移动而变慢 | 对原始数据进行完整优化 |
底层工作原理
查询(Query):SELECT product, SUM(amount) FROM marketing_view GROUP BY product
┌─────────────────────────────────────────────────────────────────┐
│ 查询执行流程 │
└─────────────────────────────────────────────────────────────────┘
用户查询
│
▼
┌───────────────────┐ ┌─────────────────────────────────────┐
│ 1. 读取快照 │───►│ s3://bucket/1/23351/_ss/ │
│ (Snapshot) │ │ 获取当前表状态 │
└───────────────────┘ └─────────────────────────────────────┘
│
▼
┌───────────────────┐ ┌─────────────────────────────────────┐
│ 2. 应用列 │───►│ 过滤器:customer_id, product, │
│ 过滤器 │ │ amount, order_date │
└───────────────────┘ └─────────────────────────────────────┘
│
▼
┌───────────────────┐ ┌─────────────────────────────────────┐
│ 3. 检查统计信息 │───►│ • 段最小/最大值 │
│ 和索引 │ │ • 布隆过滤器(Bloom Filter) │
└───────────────────┘ │ • 聚合索引(Aggregate Index) │
│ └─────────────────────────────────────┘
▼
┌───────────────────┐ ┌─────────────────────────────────────┐
│ 4. 智能数据 │───►│ 跳过无关块 │
│ 获取 │ │ 仅从 _b/ 下载所需数据 │
└───────────────────┘ └─────────────────────────────────────┘
│
▼
┌───────────────────┐ ┌─────────────────────────────────────┐
│ 5. 本地 │───►│ 完整优化和并行处理 │
│ 执行 │ │ 使用所有可用索引进行处理 │
└───────────────────┘ └─────────────────────────────────────┘
│
▼
结果:产品销售摘要
多个 Databend 集群可以同时执行此流程而无需协调——真正的计算存储分离在实际应用中。
ATTACH TABLE 代表了一个根本性转变:从为每个用例复制数据转向一个副本多个视图。无论在云环境还是本地环境中,Databend 的架构都能实现强大、高效的数据共享,同时保持企业级一致性和安全性。