ITPub博客

首页 > 数据库 > Oracle > oracle一次truncate慢处理案例

oracle一次truncate慢处理案例

原创 Oracle 作者:wanglinghua0907 时间:2024-01-26 10:10:38 1 删除 编辑

背景

XX银行一套业务系统反馈晚上跑批非常慢,后来客户发现是在处理truncate分区表分区的时候慢。

数据库版本 12.1.0.2

操作系统类型 linux

初步分析

truncate的实质是在不修改数据块的情况下,通过修改segment header的data_object_id,hwm,extent map,aux map

等信息来实现清空表的目的,其中还涉及数据字典基表以及L1、L2位图块的修改,所以说truncate操作只是存储数据的

数据块没有产生任何redo和undo,但是segment header,位图块,数据字典基表还是会产生redo和undo。一般来说

是很快的。

初步思路

首先truncate这个动作本身是非常快的,只是更新数据字典信息,不涉及清除表的真正数据。

思路1:数据库是否存在异常等待事件

思路2:在不知道具体原因的情况下对会话进行10046跟踪。(通用方法)


排查步骤

登录客户生产环境,查看等待事件,发现没有异常等待事件

对truncate语句会话进行10046跟踪

对10046会话进行跟踪:

Plain Text v SQL ID: f63rfdamawhv2 Plan Hash : 105285479 e.es 526. 17 526.63 526.27 526.75 select ts#, file#, f rom seg$ where type* block* cpu call Parse Execute Fetch total count 2e1e 2818 2810 se3e elapsed disk e e query 5273637e 5273637e current rows zele 2e1e Misses in library cache during parse: 1 Optimizer mode: CHOOSE parsing user SYS (recursive depth: Number Of plan statistics captured: 3 Rows (1st) Rows (avg) Rows (max) 1 Row Source Operation TABLE ACCESS FULL SEG$ (crz2S237 pr=e pwze time-429271 us cost-5177 sizez16 card-I)



有异常语句发现:去mos查询select ts#, file#, block# from seg$ where type# =11


匹配bug:

建议客户优先设置隐含参数:

ALTER SYSTEM SET "_drop_stat_segment" =1;

发现客户已经设置此参数,说明此设置此参数无效!


既然隐含参数设置无效,那么尝试通过打补丁的方式去规避此问题。

打完补丁后,有一个小插曲。集群启动,asm磁盘带不起来,各位知道这是啥问题不?


验证

打完补丁后验证truncate速度

alter table ADM.ADM_D_ACCOUNT_DETAIL TRUNCATE PARTITION PART_20220609


打完补丁后truncate分区表为3s

未打补丁之前truncate分区表为8分钟


结论

当我们排查问题没有思路的时候,不妨尝试下10046跟踪去细细查看执行此语句的会话全过程,或许就会明朗了。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69980685/viewspace-3005217/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、sql server、oceanbase数据库专家,拥有7年以上的大型数据库运维经验,主方向oracle,擅长故障排除、诊断,大体量(TB)迁移,异常故障修复等。拥有丰富主导大型项目经验。服务行业包括:运营商、银行、金融业、政府单位、医疗、制造业、高校等等。

注册时间:2020-07-31

  • 博文量
    116
  • 访问量
    88773