将Snowflake实例1的account_usage数据共享至实例2的方案咨询
关于Snowflake跨实例共享ACCOUNT_USAGE数据的方案解答
一、物化视图+数据共享的可行性
Snowflake内置的snowflake.account_usage是只读的共享数据库,无法直接在其上创建物化视图,但可以通过以下步骤实现类似需求:
- 先将
account_usage.table1的目标数据复制到你自己的数据库表中:CREATE OR REPLACE TABLE MY_DB.MY_SCHEMA.MY_TABLE AS SELECT * FROM snowflake.account_usage.table1 WHERE <你的过滤条件>; -- 筛选需要的部分数据 - 在这个自定义表上创建物化视图:
CREATE OR REPLACE MATERIALIZED VIEW MY_DB.MY_SCHEMA.MY_MV AS SELECT <指定列> FROM MY_DB.MY_SCHEMA.MY_TABLE WHERE <额外过滤规则>; - 将该物化视图加入数据共享对象,共享给Snowflake实例2。数据共享支持共享自定义物化视图,实例2可直接查询共享对象,无需复制数据副本。
二、除Copy命令外的可行方案
- 原生数据共享(Secure Data Sharing):这是Snowflake推荐的跨账户数据共享方案。只需将
ACCOUNT_USAGE数据同步到自定义表/物化视图,即可创建共享对象并授权给实例2。实例2无需存储数据,直接访问实例1的对象,性能高效且实时性强。 - 任务(Task)+ 流(Stream):针对增量同步场景,用流监控
ACCOUNT_USAGE.table1的新增/变更数据,通过任务定期将增量同步到自定义表,再共享该表给实例2,适合持续同步更新数据的场景:-- 创建流监控表变化 CREATE OR REPLACE STREAM MY_DB.MY_SCHEMA.MY_STREAM ON TABLE snowflake.account_usage.table1 APPEND_ONLY = TRUE; -- 创建定时任务同步增量数据 CREATE OR REPLACE TASK MY_DB.MY_SCHEMA.MY_TASK WAREHOUSE = MY_WH SCHEDULE = 'USING CRON 0 * * * * UTC' -- 每小时执行一次 AS INSERT INTO MY_DB.MY_SCHEMA.MY_TABLE SELECT * FROM MY_DB.MY_SCHEMA.MY_STREAM; -- 启动任务 ALTER TASK MY_DB.MY_SCHEMA.MY_TASK RESUME; - Snowpipe + 云存储:将
ACCOUNT_USAGE数据导出到云存储(如AWS S3、Azure Blob),在实例2中配置Snowpipe自动将云存储中的数据加载到内部表,实现近实时同步。 - 外部表:在实例2中创建外部表,指向实例1导出到云存储的
ACCOUNT_USAGE数据文件。实例2可直接查询外部表数据,无需将数据加载到Snowflake内部表,适合按需查询场景。 - 联邦查询(Federated Query):配置实例2对实例1的跨账户访问权限,在实例2中直接查询实例1的
snowflake.account_usage数据。该方案需额外权限配置,查询性能略逊于数据共享。
内容的提问来源于stack exchange,提问作者Deepika reddy
相关产品推荐
相关产品推荐

