holo数仓查看表存储明细函数

本文介绍了如何在Holo数仓中,特别是V2.1及以上版本,通过pg兼容的hologres.hg_relation_size函数查询表的存储明细,包括数据、binlog、mv和所有类型的存储大小,帮助开发人员评估表占用的存储空间。

holo数仓查看表存储明细函数

背景

当开发人员需要查看holo表的存储明细时,在没有可视化的界面基础上,很难评估数据的所占存储

解决思路

holo数仓是基于pg协议的一款大数据数仓,可以通过pg兼容函数来查看,一下就回到熟悉的开发领域上了

hologres.hg_relation_size函数

  • 使用限制
    仅V2.1及以上版本Hologres实例支持使用hologres.hg_relation_size函数。
  • 函数语法
SELECT hologres.hg_relation_size('<schema.table>','[data|binlog|mv|all]') ;
  • 参数说明
参数说明
schema.table表的Schema名称和表名称。
[data|binlog|mv|all]可选参数,其中:
data:表数据的存储大小。
binlog:表Binlog的存储大小。
mv:如果为该表创建了物化视图,代表物化视图占用的存储大小。
all:表的总存储量。
  • 使用示例
    查看单表的Binlog存储大小。
SELECT hologres.hg_relation_size('action_log.user_login_log','binlog') ;
<think>我们正在讨论Hologres的分桶设计方法,目的是优化存储和查询性能。根据引用[3]:“分区指的是在一张内对据进行切分,分桶则指的是在一个分区内对据进行分组。在大多场景中设置分桶的概念是为了保证据的离散度,使据均匀分布,这样在后续的计算中通过并行处理,尽可能的提高资源利用率。设置分桶也可以加速据的过滤。” 这说明了分桶的核心作用:保证据均匀分布,提高并行处理效率,加速据过滤。 分桶设计的关键点: 1. 选择分桶字段:通常选择高基的字段(即唯一值多的字段),如用户ID、订单ID等,这样可以避免据倾斜。同时,该字段应经常出现在查询的过滤条件(WHERE子句)或连接条件(JOIN条件)中,以利用分桶加速过滤。 2. 确定分桶量:分桶量需要合理设置,过多或过少都会影响性能。一般建议分桶量为集群Shard量的整倍(例如2倍),这样可以使据均匀分布到各个Shard上。Hologres中一个Shard对应一个物理分片,分桶设置不当可能导致据倾斜或资源浪费。 3. 与分区结合:分区和分桶是两种不同的据划分方式。分区通常按时间或枚举值划分,用于快速裁剪据;分桶则在分区内进一步细分,用于并行计算。合理搭配分区和分桶可以极大提升查询性能。 性能优化考虑: - 避免据倾斜:如果分桶字段选择不当,导致某些桶的据量过大,会拖慢整个查询。因此,选择高基且分布均匀的字段至关重要。 - 与集群规模匹配:分桶量应与集群的Shard量协调。例如,如果集群有10个Shard,那么分桶可以设置为20(即2倍),这样每个Shard会处理2个桶的据,实现负载均衡。 - 查询模式:根据查询模式调整分桶策略。如果查询经常按某个字段进行等值查询或连接,那么选择该字段作为分桶字段可以显著提升性能。 示例建语句(参考引用[2]和[3]): ```sql CREATE TABLE user_orders ( user_id bigint, order_id bigint, order_time timestamp, amount double precision, -- 其他字段... ) PARTITION BY DATE(order_time) -- 按天分区 WITH ( distribution_key = 'user_id', -- 分桶字段(分布键) bucket_count = 32, -- 分桶量,建议为Shard的整倍 clustered_by = (order_id) -- 可选,在桶内按order_id排序,加速范围查询 ); ``` 在这个例子中,我们按`order_time`进行分区(按天),然后按`user_id`进行分桶(分布键),并设置了32个分桶。同时,我们使用`clustered_by`指定了桶内按`order_id`排序,这样在按订单ID范围查询时可以利用局部有序性加速查询。 注意事项: - 分桶字段一旦确定,就不能修改(因为据已经按此分布)。因此设计时需要慎重。 - 分桶量在创建后也不能修改,所以需要预先估计据量和增长趋势。 综上所述,Holo的分桶设计需要综合考虑业务查询模式、据分布特性和集群资源,以达到最优的查询性能。 §§相关问题§§ 1. Hologres中分桶量如何确定?有没有具体的计算公式? 2. 如果分桶字段选择不当导致据倾斜,应该如何解决? 3. Hologres的分桶策略与分区策略应该如何配合使用? 4. 除了分桶,Hologres还有哪些性能优化手段?</think>### Hologres分桶设计方法与性能优化 #### 分桶核心原理 根据引用[3],分桶是在分区内对据进行分组的技术,核心目的是: 1. **保证据离散度**:使据均匀分布,避免据倾斜 2. **提高并行效率**:通过分组实现并行处理,最大化资源利用率 3. **加速据过滤**:桶内据有序性可优化范围查询性能 分桶公式可示为: $$BucketID = hash(ColumnValue) \mod N$$ 其中$N$为分桶量,$hash$为哈希函数。 #### 分桶设计方法 1. **分桶字段选择原则**: - 高基字段(如用户ID、设备ID) - 高频查询字段(如WHERE子句常用列) - 避免选择低基字段(如性别、状态标志) 2. **分桶量确定**(引用[3]): ```学公式 N = k \times S ``` 其中: - $S$ = Shard量(物理分片) - $k$ = 并行系(建议2-4) - 示例:10个Shard时,分桶取20-40 3. **与分区协同设计**: - 分区层:按时间/地域粗粒度划分(如`PARTITION BY DATE(event_time)`) - 分桶层:在分区内按业务键细粒度分组(如`DISTRIBUTED BY user_id`) #### 性能优化策略 1. **查询加速**: - 等值查询:`WHERE bucket_key = X` 直接定位桶 - 范围查询:桶内据有序存储可加速`BETWEEN`操作 - JOIN优化:相同分桶策略可实现**桶对齐JOIN** 2. **写入优化**: ```sql -- 建示例(结合引用[2][3]) CREATE TABLE user_behavior ( user_id BIGINT, event_time TIMESTAMP, action VARCHAR ) PARTITION BY DATE(event_time) -- 时间分区 DISTRIBUTED BY (user_id) -- 分桶字段 BUCKET COUNT 32; -- 分桶 ``` 3. **存储优化**: - 自动冷热分层:热据存内存,冷据存SSD(引用[2]) - 据压缩:列存格式自动压缩(ORC/Parquet) #### 典型场景配置 | 场景 | 分区策略 | 分桶字段 | 分桶 | 优势 | |------|----------|----------|--------|------| | 用户行为分析 | 按天分区 | `user_id` | Shard×2 | UV统计优化 | | 交易流水 | 按月分区 | `order_id` | Shard×3 | 订单查询加速 | | IoT据 | 按设备类型 | `device_id` | Shard×4 | 设备维度聚合 | #### 注意事项 1. **避免过度分桶**:桶过多会增加元据开销 2. **监控据倾斜**:定期检查`SELECT hg_skewness(table_name)` 3. **动态调整**:随着据增长,需重新评估分桶策略(需重建) > 引用说明: > [^1]:实时分层架构需保证据高效流动 > [^2]:据分层管理需平衡一致性与性能 > [^3]:分桶设计核心是保证据均匀分布与并行效率 > [^4]:需权衡功能差异与延迟要求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvin_Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值