分区表分区时粒度太大

oracle数据库,下午发生性能问题

 

1、  检查两台服务器cpumemoryio等性能参数发现CPU使用率接近100%

2、  检查oracle session信息发现TMID_DEV_USER_DAYTMID_INCO_USER_DAYTMID_USE_USER_DAY等多个表上有等待事件,如下:

1  read by other session     package_PR_TADR_CDMA_ALL_DAY-028-201305    966:4233293320CTCNET     dsadm@dss-db31@@12542   05-07 12:48

2  read by other session     package_PR_TADR_CDMA_ALL_DAY-991-201305    823:3701837735CTCNET     dsadm@dss-db31@@20264   05-07 08:48

3  read by other session     package_PR_TADR_CDMA_ALL_DAY-771-201305    990:2304318681CTCNET     dsadm@dss-db31@@15093   05-07 15:39

4  db file sequential read   JDBC Thin Client886:1749825776CTCNET     dsadm@dss-db31@@11831   05-07 10:25

5  db file scattered read     package_PR_TAdR_3gdev_user_day-791-20131080:164352509CTCNET     dsadm@dss-db31@@26302   05-07 15:46

6  db file scattered read     package_PR_TADR_CDMA_ALL_DAY-371-201305    820:4233293320CTCNET     dsadm@dss-db31@@11817   05-07 13:05

7  db file scattered read     package_PR_TADR_CDMA_ALL_DAY-029-201305    1010:1780394967        CTCNET     dsadm@dss-db31@@1971905-07 12:52

8         PX Deq Credit: send blkd       oracle@dss-db41 (PZ99)        908:2432359197CTMB         zhanghuijun@WORKGROUP\DL580-2@1         05-07 15:56

1、  检查这些等待事件对应的sql及其执行计划如下:

UPDATE TADR_CDMA_ALL_DAY T SET T.LY_ONLINE_USER =( SELECT SUM(X.ONLINE_USER) FROM TMID_DEV_USER_DAY X

WHERE (X.DR_PROV_ID=:B1 OR :B1 ='001' ) AND X.STAT_DATE=:B3 AND T.DR_PROV_ID=X.DR_PROV_ID AND

T.REGION_ID=X.REGION_ID) WHERE T.STAT_DATE=:B2 AND (T.DR_PROV_ID=:B1 OR :B1 ='001' )

 

Plan hash value: 3471877290

 

--------------------------------------------------------------------------------------------------------------

| Id  | Operation                | Name              | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

--------------------------------------------------------------------------------------------------------------

|   0 | UPDATE STATEMENT         |                   |       |       |  2208K(100)|          |       |       |

|   1 |  UPDATE                  | TADR_CDMA_ALL_DAY |       |       |            |          |       |       |

|   2 |   TABLE ACCESS FULL      | TADR_CDMA_ALL_DAY |    18 |   414 |  1572   (1)| 00:00:23 |       |       |

|   3 |   SORT AGGREGATE         |                   |     1 |    20 |            |          |       |       |

|   4 |    PARTITION RANGE SINGLE|                   |     5 |   100 |   122K  (1)| 00:28:37 |   KEY |   KEY |

|   5 |     TABLE ACCESS FULL    | TMID_DEV_USER_DAY |     5 |   100 |   122K  (1)| 00:28:37 |   KEY |   KEY |

从分析计划来看TMID_DEV_USER_DAYTMID_INCO_USER_DAYTMID_USE_USER_DAY等表查询效率较低。

语句如下:

UPDATE TADR_CDMA_ALL_DAY T SET T.LY_TOT_DEV_USER =( SELECT SUM(X.CM_TOT_DEV_USER) FROM
TMID_DEV_USER_DAY X WHERE (X.DR_PROV_ID=:B1 OR :B1 ='001' ) AND X.STAT_DATE=:B3 AND
T.DR_PROV_ID=X.DR_PROV_ID AND T.REGION_ID=X.REGION_ID) WHERE T.STAT_DATE=:B2 AND (T.DR_PROV_ID=:B1 OR
:B1 ='001' )

原因:

1、月初出帐期间,各种任务组合的叠加意外导致CPU的使用过载,加重了性能问题。

2、大表分区相比较数据规模颗粒偏大(比如,有表单分区达到5千万记录),由于oracle优化器本身有动态sample等机制,对大表而言内部的统计信息变化更容易导致对执行计划产生不确定影响的概率,影响SQL执行效率。

解决方法:

1、在表中创建local索引。

2、将分区粒度变小,拆分区。

最后业务恢复正常

 

<think>嗯,用户询问的是Apache Doris分区大小的推荐设置。这个问题涉及到数据库性能优化的核心知识,需要结合分区机制的原理和实际应用场景来分析。 用户可能正在规划Doris集群的数据分布策略,或者是遇到了分区过大导致的查询性能问题。从技术深来看,用户应该具备一定的分布式数据库基础,但可能缺乏具体的实践经验。 关于分区大小,Doris官方文档没有给出绝对值,这很合理——因为实际业务场景差异太大。不过可以给出几个关键原则:首先是单分区数据量控制在1-10GB这个黄金区间,这个范围能平衡查询效率和后台管理开销。其次是分区粒度,按天分区比按月更灵活,特别是对于序数据。用户可能没意识到的是,分区数上限其实更重要,单个BE节点超过1万个分区就可能引发元数据压力。 用户引用的资料提到List分区,这提示用户的数据可能有枚举特征。对于这类数据,除了大小控制外,还要注意分区列的选择——优先使用高频查询条件涉及的列。另外补充一个容易被忽视的点:冷热数据分离策略。用户如果能把历史数据自动转存到廉价存储,就能显著降低总拥有成本。 考虑到用户后续可能遇到的问题,可以准备几个延伸方向:比如当分区已经过大如何补救,或者如何监控分区健康状态。这些实操性问题往往比理论推荐值更重要。</think>在Apache Doris中,**分区大小的合理设置对查询性能、数据管理效率和集群稳定性至关重要**。以下是基于最佳实践的分区设置建议: ### 📌 核心原则 1. **单分区数据量** - **推荐范围**:`1GB - 10GB` - **上限阈值**:不超过 `100GB`(过大会导致Compaction压力剧增) - **下限阈值**:避免小于 `100MB`(分区过小导致元数据膨胀) 2. **分区数量控制** - **单表总分区数**:不超过 `10,000` 个 - **单BE节点分区数**:不超过 `100,000` 个(避免元数据内存占用过高) --- ### ⚙️ 分区策略选择 | **分区类型** | **适用场景** | **大小控制建议** | |--------------|------------------------------|------------------------------------------| | **Range分区** | 序数据(按天/月) | 按粒度拆分:<br>- 日分区:1-5GB<br>- 月分区:30-100GB | | **List分区** | 枚举值(城市、品类等)[^2] | 确保每个枚举值数据量均匀,避免热点分区 | --- ### 🚨 关键注意事项 1. **写入性能影响** 分区过大,数据导入需等待后台Compaction完成,导致写入延迟增加。建议监控`compaction_score`指标,若持续高于100需调整分区策略。 2. **查询效率优化** ```sql -- 通过EXPLAIN验证分区裁剪 EXPLAIN SELECT * FROM sales WHERE dt = '2023-10-01'; -- 输出需包含:`PartitionRange: [2023-10-01, 2023-10-01]` ``` 3. **动态分区管理** 启用动态分区自动维护(避免历史分区堆积): ```sql ALTER TABLE tbl SET ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.end" = "3", -- 保留最近3天分区 "dynamic_partition.buckets" = "8" -- 分桶数 ); ``` --- ### 🔧 调整示例 **场景**:每日数据量约50GB **优化方案**: ```sql -- 按小细分分区(适合高频查询) PARTITION BY RANGE(dt) ( PARTITION p20231001_00 VALUES [('2023-10-01 00'), ('2023-10-01 01')), PARTITION p20231001_01 VALUES [('2023-10-01 01'), ('2023-10-01 02')), ... ) -- 配合分桶数调整(每个分桶约1GB数据) DISTRIBUTED BY HASH(user_id) BUCKETS 50 ``` --- ### 📊 监控与调优 1. **元数据统计** ```sql SHOW PARTITIONS FROM tbl; -- 查看分区大小/行数 ``` 2. **性能瓶颈检测** - `be.bytes_written` 持续高位 → Compaction压力大 - `fe.journal_write` 延迟高 → 元数据过多 --- **总结**:最佳分区大小需结合数据特征、查询模式及硬件资源动态调整。**建议在测试环境模拟真实负载,通过`EXPLAIN`和系统指标验证设计合理性**。对于超大规模数据,可结合`ROLLUP`和物化视图进一步优化[^1]。 --- ### ❓相关问题 1. Doris中如何监控分区Compaction状态及性能影响? 2. 分区键选择不当导致查询无法裁剪应如何补救? 3. 冷热数据分层存储如何与分区策略结合实现成本优化? 4. List分区中枚举值分布不均的负载均衡方案?[^2] [^1]: Apache Doris的分区机制是其高性能的关键,合理配置可充分利用分布式计算能力。 [^2]: List分区适用于枚举类型数据列,需确保分区值均匀分布。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值