如何通过元数据查询Snowflake外部表的大小?
如何通过元数据查询Snowflake外部表的大小与行数
当然可以!完全不用执行SELECT COUNT(*)这类全表扫描的语句,Snowflake提供了元数据驱动的方式,能直接获取外部表的大小(优先字节单位)和行数,下面是最实用的几种方法:
方法1:查询INFORMATION_SCHEMA.EXTERNAL_TABLES视图
这是最直接的方案,这个系统视图包含了外部表的核心元数据,其中就有总文件大小和预估行数(前提是你已经刷新过外部表的元数据)。
查询语句:
SELECT TABLE_NAME AS **外部表名称**, TOTAL_FILE_SIZE AS **总大小(字节)**, TOTAL_FILE_SIZE / (1024*1024) AS **总大小(MB)**, ROW_COUNT AS **预估行数** FROM INFORMATION_SCHEMA.EXTERNAL_TABLES WHERE TABLE_SCHEMA = '<你的Schema名>' AND TABLE_CATALOG = '<你的数据库名>';
关键注意点:
TOTAL_FILE_SIZE直接返回字节数,完美匹配你的需求。ROW_COUNT是预估行数,必须先刷新外部表元数据才会更新为最新值:ALTER EXTERNAL TABLE <你的外部表名> REFRESH;- 如果不执行刷新操作,这里的大小和行数可能和外部存储(如S3、Azure Blob)的实际数据不一致,尤其是当存储里的文件有新增、删除或修改时。
方法2:关联外部表对应的Stage查询
如果你的外部表是基于某个Stage创建的,也可以通过查询Stage的元数据来获取存储大小:
SELECT s.STAGE_NAME AS **Stage名称**, s.STORAGE_LOCATION AS **存储位置**, SUM(f.FILE_SIZE) AS **总大小(字节)**, SUM(f.FILE_SIZE)/(1024*1024) AS **总大小(MB)**, COUNT(f.FILE_NAME) AS **文件总数** FROM INFORMATION_SCHEMA.STAGES s JOIN INFORMATION_SCHEMA.STAGE_FILES f ON s.STAGE_NAME = f.STAGE_NAME AND s.STAGE_SCHEMA = f.STAGE_SCHEMA WHERE s.STAGE_NAME = '<关联的Stage名>' AND s.STAGE_SCHEMA = '<你的Schema名>' GROUP BY s.STAGE_NAME, s.STORAGE_LOCATION;
说明:
- 这个方法适合你想确认外部表关联的存储位置的总数据量,但它无法返回行数,只能得到文件总大小和文件数量。
- 若刚修改过外部存储的文件,建议先执行
ALTER STAGE <Stage名> REFRESH来同步最新的文件元数据。
方法3:使用DESC EXTERNAL TABLE快速查询单个表
如果你只是想快速查看某一个外部表的信息,可以用这个命令:
DESC EXTERNAL TABLE <你的外部表名>;
在返回的结果中,你能找到total_file_size和row_count字段,同样需要先刷新元数据才能获取最新值。
内容的提问来源于stack exchange,提问作者Nir99




