为什么Snowflake仓库冷启动后平均缓存使用率依然很高?
Snowflake 缓存运行机制
Snowflake内置三级缓存体系,你观测到的高缓存使用率来自虚拟仓库本地SSD缓存,和查询结果缓存是完全独立的机制:
- 查询结果缓存:存储过去24小时内完全一致的查询返回结果,仅当查询语句、底层表数据、权限配置均无变化时才会命中,你所有查询样本不重复,因此不会命中这层缓存,和你的初始预判一致。
- 虚拟仓库本地SSD缓存:存储的是查询扫描过的表微分区数据块,而非完整查询结果。只要后续查询扫描的微分区已经被加载到当前运行仓库的SSD中,不管查询过滤条件、返回内容是否和之前的查询一致,都会直接命中缓存,无需重新从远程对象存储拉取数据。
你观测到的缓存使用率从0逐步升高至95%的现象,和你猜测的「同分区命中」逻辑完全吻合:Snowflake的表采用微分区结构存储,单个微分区默认保存16MB压缩数据,若你使用的sessionkey、sessionstarttime不是表的集群键,不同过滤条件对应的行很可能分布在相同的微分区中。首批查询执行时会将涉及的微分区拉取到本地缓存,后续查询只要扫描到已加载的微分区就会命中缓存,缓存使用率随扫描过的微分区数量增加而上升,出现波动是因为缓存满时会按LRU策略淘汰最久未使用的微分区。
单条SQL使用的分区信息查询方法
你可以通过Snowflake内置的系统视图查询指定SQL的分区扫描细节:
- 首先获取目标SQL的QUERY_ID,可执行以下语句检索近期执行的相关查询ID:
SELECT QUERY_ID, QUERY_TEXT, START_TIME FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY(RESULT_LIMIT => 200)) WHERE QUERY_TEXT LIKE '%select * from <你的表名> where sessionkey%' ORDER BY START_TIME DESC;
- 代入QUERY_ID即可查询该SQL的分区扫描统计:
SELECT TOTAL_PARTITIONS_SCANNED, PARTITIONS_SCANNED_FROM_CACHE, BYTES_SCANNED, BYTES_SCANNED_FROM_CACHE, CACHE_USED_PERCENTAGE FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE QUERY_ID = '<替换为你的QUERY_ID>';
如果需要查看具体命中缓存的微分区明细,可查询QUERY_PROFILE视图:
SELECT PARTITION_NAME, ROW_COUNT, BYTES_SCANNED, BYTES_SCANNED_FROM_CACHE FROM TABLE(INFORMATION_SCHEMA.QUERY_PROFILE('<替换为你的QUERY_ID>')) WHERE OPERATION = 'TableScan';
内容的提问来源于stack exchange,提问作者Tushar Goel
相关产品推荐
相关产品推荐

