Doris Doris分区表-动态分区

Doris的动态分区功能在0.12版本引入,支持范围分区,用于自动管理表分区的生命周期,TTL策略,但需注意在CCR同步期间可能失效。

Doris分区表-动态分区

https://doris.apache.org/zh-CN/docs/dev/advanced/partition/dynamic-partition

动态分区是在 Doris 0.12 版本中引入的新功能。旨在对表级别的分区实现生命周期管理(TTL),减少用户的使用负担。
目前实现了动态添加分区及动态删除分区的功能。
动态分区只支持 Range 分区。
注意:这个功能在被CCR同步时将会失效。如果这个表是被CCR复制而来的,即PROPERTIES中包含is_being_synced = true时,在show create table中会显示开启状态,但不会实际生效。当is_being_synced被设置为 false 时,这些功能将会恢复生效,但is_being_synced属性仅供CCR外围模块使用,在CCR同步的过程中不要手动设置。

示例

CREATE TABLE `dwd_test_xxxx_aaaa_rim` (
 `apply_date`                date         NULL COMMENT '日期',
 `user_course_id`            bigint(20)   NULL COMMENT 
<think>我们正在讨论如何在Doris中查询分区表。根据用户提供的引用内容,我们可以总结以下几点: 1. Doris支持复合分区(先分区再分桶)和动态分区(自动管理分区生命周期)。 2. 动态分区功能主要用于自动添加和删除分区(如按时间分区),但只支持Range分区。 3. 在查询分区表时,可以通过在WHERE条件中指定分区列的条件来实现分区剪枝,从而减少扫描的数据量,提高查询效率。 因此,查询分区表的方法与普通类似,但关键在于利用分区键的条件来触发分区剪枝。具体步骤如下: ### 1. **创建分区表(回顾)** 在查询之前,我们需要先有一个分区表。以动态分区为例,创建一个按天分区的: ```sql CREATE TABLE example_db.dynamic_partition_table ( date_key DATE, user_id INT, city VARCHAR(50), age INT, cost DECIMAL(10,2) ) PARTITION BY RANGE (date_key) () DISTRIBUTED BY HASH(user_id) BUCKETS 10 PROPERTIES ( "dynamic_partition.enable" = "true", -- 开启动态分区 "dynamic_partition.time_unit" = "DAY", -- 按天分区 "dynamic_partition.start" = "-30", -- 保留最近30天的分区 "dynamic_partition.end" = "3", -- 提前创建未来3天的分区 "dynamic_partition.prefix" = "p", -- 分区名前缀 "dynamic_partition.buckets" = "10" -- 分桶数 ); ``` 此会按`date_key`自动创建和管理分区(如`p20240101`代2024年1月1日的数据)[^1][^3]。 ### 2. **查询分区表** 查询时,在WHERE条件中指定分区列(如`date_key`)的范围,Doris会自动过滤掉不相关的分区: ```sql -- 查询特定日期范围的数据(触发分区剪枝) SELECT user_id, SUM(cost) FROM example_db.dynamic_partition_table WHERE date_key >= '2024-05-01' AND date_key <= '2024-05-07' GROUP BY user_id; ``` 执行计划中会显示`partitions=3/10`(假设有10个分区,只扫描了3个),证明分区剪枝生效[^4][^5]。 ### 3. **注意事项** - **分区键条件**:确保WHERE条件中包含分区列(如`date_key`),且使用范围(`BETWEEN`、`>=`等)或等值(`=`)过滤。 - **避免函数转换**:直接在分区列上使用函数(如`DATE_FORMAT(date_key, '%Y%m%d')`)会导致无法剪枝。应改为: ```sql -- 错误示例(无法剪枝): SELECT ... WHERE DATE_FORMAT(date_key, '%Y%m%d') = '20240501'; -- 正确示例(直接使用日期范围): SELECT ... WHERE date_key = '2024-05-01'; ``` - **复合分区**:如果是复合分区(如先按`date_key`分区,再按`city`分桶),查询时优先使用分区键过滤,再使用分桶键过滤[^1][^4]。 ### 4. **验证分区剪枝** 使用`EXPLAIN`命令查看查询计划,确认是否剪枝: ```sql EXPLAIN SELECT ... WHERE date_key = '2024-05-01'; ``` 输出中应包含: ``` partitions=1/10 -- 只扫描了1个分区(假设总共有10个分区) ``` ### 5. **动态分区的查询优化** 动态分区的数据可能随时间自动增减(如TTL删除旧分区)。查询时需注意: - 避免查询已删除的分区(如`date_key < '2023-01-01'`),否则会报错`Partition not exists`。 - 通过`SHOW DYNAMIC PARTITION TABLES`监控分区状态[^3]。 ### 示例:复杂查询 结合分区键和分桶键进行高效查询: ```sql -- 查询2024年5月北京地区的数据(假设分区键为date_key,分桶键为user_id) SELECT city, AVG(age), SUM(cost) FROM example_db.dynamic_partition_table WHERE date_key BETWEEN '2024-05-01' AND '2024-05-31' AND city = '北京' GROUP BY city; ``` 此查询会先按`date_key`剪枝分区,再按`city`过滤数据,最后在分桶内聚合[^1][^4]。 ### 总结 在Doris中查询分区表的关键是**在WHERE条件中直接使用分区列进行范围或等值过滤**,避免对分区列使用函数或转换。动态分区会自动维护分区生命周期,但查询时仍需确保分区存在。通过`EXPLAIN`验证分区剪枝效果,可显著提升查询性能。 §§相关问题§§ 1. 如何监控Doris动态分区的状态? 2. 分区剪枝失效的常见原因有哪些? 3. Doris分区表与分桶在查询性能上的差异? 4. 如何为时间序列数据设计高效的分区策略? [^1]: Doris 创建复合分区表动态分区[^1] [^2]: Doris hdfs数据导入doris动态分区[^2] [^3]: Doris Doris分区表-动态分区[^3] [^4]: Doris分区表和分桶[^4] [^5]: palo(doris分区的正确使用[^5]</think>### Doris 查询分区表的方法 在 Doris 中查询分区表的核心是通过 **分区剪枝(Partition Pruning)** 优化查询性能,即利用分区键条件过滤无关分区,减少数据扫描量。以下是具体操作方法和注意事项: --- #### 1. **基础查询语法** 分区表的查询语法与普通一致,只需在 `WHERE` 子句中**显式指定分区键条件**即可触发分区剪枝: ```sql -- 查询特定分区(如日期分区) SELECT * FROM sales WHERE dt = '2024-05-01'; -- 仅扫描 dt='2024-05-01' 的分区[^4] -- 查询分区范围 SELECT * FROM sales WHERE dt >= '2024-05-01' AND dt <= '2024-05-07'; -- 仅扫描该日期范围内的分区[^5] ``` --- #### 2. **分区剪枝的关键规则** - **直接使用分区列**: 分区键(如 `dt`)必须作为过滤条件**直接出现在 `WHERE` 子句中**,不可嵌套函数或计算: ```sql ✅ 正确:WHERE dt = '2024-05-01' -- 触发剪枝 ❌ 错误:WHERE DATE_FORMAT(dt, '%Y%m%d') = '20240501' -- 无法剪枝(全扫描)[^5] ``` - **范围分区需明确边界**: 使用 `VALUES [...]` 定义的分区(左闭右开区间),查询时需匹配分区定义: ```sql -- 分区定义:PARTITION p202405 VALUES [('2024-05-01'), ('2024-06-01')) ✅ 有效:WHERE dt >= '2024-05-01' AND dt < '2024-06-01' ❌ 无效:WHERE dt = '2024-06-01' -- 不属于该分区[^4] ``` --- #### 3. **动态分区的查询** 动态分区(如按天自动创建分区)的查询方式与静态分区一致,但需注意: - **自动分区名匹配**: 动态分区的命名格式为 `prefix + 时间`(如 `p20240501`),但查询时**无需关注分区名**,直接使用分区键过滤: ```sql -- 动态分区(按天分区) SELECT * FROM log_table WHERE event_date = '2024-05-01'; -- 自动定位到分区 p20240501[^3] ``` - **避免查询未来/过期分区**: 动态分区可能自动删除旧分区(如 TTL 设置),查询历史数据前需确认分区是否存在。 --- #### 4. **复合分区表的查询** 若同时有分区(`PARTITION BY`)和分桶(`DISTRIBUTED BY`),优先用分区键过滤,再结合分桶键: ```sql -- 先按 dt 分区,再按 user_id 分桶 SELECT city, SUM(amount) FROM sales WHERE dt BETWEEN '2024-05-01' AND '2024-05-07' -- 分区剪枝 AND user_id IN (101, 102) -- 分桶过滤 GROUP BY city; ``` --- #### 5. **验证分区剪枝效果** 通过 `EXPLAIN` 命令检查查询计划,确认是否触发剪枝: ```sql EXPLAIN SELECT * FROM sales WHERE dt = '2024-05-01'; ``` 输出中若包含 `partitions=1/100`(示 100 个分区中只扫描了 1 个),则剪枝成功[^1]。 --- #### 6. **性能优化建议** 1. **分区粒度适中**: 避免分区过多(如 >1000 个),否则元数据压力增大[^1]。 2. **冷热数据分离**: 频繁查询的热数据使用 SSD 存储,冷数据转存至 HDD[^3]。 3. **并行查询**: 分桶数(`BUCKETS`)建议为集群节点数的倍数,充分利用并行计算。 > **💡 关键总结** > - **必做**:在 `WHERE` 子句中直接使用分区键作为过滤条件。 > - **禁止**:对分区键使用函数或达式(如 `YEAR(dt)=2024`)。 > - **动态分区**:无需手动管理分区名,按分区键查询即可。 > - **验证**:通过 `EXPLAIN` 确认分区剪枝是否生效。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文文鑫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值