网站首页 > 技术文章 正文
数据库一条insert某段时间突然变慢,平均单次执行逻辑读暴增至20万,本文分享整个处理过程。
概述
某客户的数据库一条insert语句某段时间突然变慢,平均单次执行逻辑读暴增至20万,最终定位为insert时因可用空间不充足递归清理recyclebin中的对象导致,递归delete from RECYCLEBIN$,因没有合适的索引走full scan,正常情况下没有影响,但该客户的这套库SYS.RECYCLEBIN$竟然达到700M,最终导致了该问题。
这里在我的测试环境中,模拟重现该问题。
?
测试过程
1. 清空回收
?
SQL> purge dba_recyclebin;
DBA Recyclebin purged.
?
2. 创建测试表空间
?
SQL> create tablespace testtbs datafile '/home/oracle/data/testtbs.dbf' size 10m;
Tablespace created.
SQL> @df
?
TABLESPACE_NAME TotalMB UsedMB FreeMB % Used Ext Used
------------------------------ ---------- ---------- ---------- ------ --- ----------------------
SYSAUX 350 328 22 94% YES |################### |
SYSTEM 280 271 9 97% YES |####################|
TBS 20 17 3 85% NO |################# |
TBS2 10 2 8 20% NO |#### |
TEMP 36 -64 100 -177% YES ||
TESTTBS 10 1 9 10% NO |## |
UNDOTBS1 100 48 52 48% YES |########## |
?
7 rows selected.
SQL>
?
3. 创建3个测试表
?
tmp1,tmp2 10000条记录
tmp3 空表
SQL> create table test.tmp1 tablespace testtbs as select * from dba_objects where rownum<=10000;
?
Table created.
SQL> SQL> create table test.tmp2 tablespace testtbs as select * from dba_objects where rownum<10000;
?
Table created.
SQL> SQL> create table test.tmp3 tablespace testtbs as select * from dba_objects where 1=0;
?
Table created.
?
4. 删除表 test.tmp1
?
SQL> drop table test.tmp1 ;
Table dropped.
?
5. insert sys.RECYCLEBIN$,把sys.RECYCLEBIN$ 撑大
?
SQL> insert into sys.RECYCLEBIN$ select t.* from sys.RECYCLEBIN$ t connect by level<2000000;
insert into sys.RECYCLEBIN$ select t.* from sys.RECYCLEBIN$ t connect by level<2000000
*
ERROR at line 1:
ORA-30009: Not enough memory for CONNECT BY operation
?
?
这个报错,无影响,达到撑大sys.RECYCLEBIN$的目的就行。
?
SQL> rollback;
Rollback complete.
SQL> @seg sys.RECYCLEBIN$
?
SEG_MB OWNER SEGMENT_NAME SEG_PART_NAME SEGMENT_TYPE SEG_TABLESPACE_NAME BLOCKS HDRFIL HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------ ---------- ---------- ----------
136 SYS RECYCLEBIN$ TABLE SYSTEM 17408 13 34656
26 SYS RECYCLEBIN$_OBJ INDEX SYSTEM 3328 13 34680
23 SYS RECYCLEBIN$_TS INDEX SYSTEM 2944 13 34672
24 SYS RECYCLEBIN$_OWNER INDEX SYSTEM 3072 13 34664
?
6. 开启10046,insert test.tmp3 重现该递归清理回收站问题
?
SQL> oradebug setmypid
Statement processed.
SQL> oradebug event 10046 trace name context forever,level 12
Statement processed.
SQL> oradebug tracefile_name
/app/oracle/diag/rdbms/db19c/db19c/trace/db19c_ora_2604.trc
SQL> insert /*+gather_plan_statistics */into test.tmp3 select * from test.tmp2 ;
?
9999 rows created.
?
SQL> SQL> @x
Display execution plan for last statement for this session from library cache...
?
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 1ndf8zpn2bpsp, child number 0
-------------------------------------
insert /*+gather_plan_statistics */into test.tmp3 select * from
test.tmp2
?
Plan hash value: 1016474986
?
-------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time | Buffers | Reads |
-------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | | |
?
?
?
从上面的执行计划看到逻辑读2989,这是一个正常值。
?
继续insert数据,直到表空间不够递归清理回收站
SQL> insert /*+gather_plan_statistics */into test.tmp3 select * from test.tmp2 ;
9999 rows created.
SQL> insert /*+gather_plan_statistics */into test.tmp3 select * from test.tmp2 ;
9999 rows created.
SQL> insert /*+gather_plan_statistics */into test.tmp3 select * from test.tmp2 ;
9999 rows created.
SQL> @x
Display execution plan for last statement for this session from library cache...
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 1ndf8zpn2bpsp, child number 0
-------------------------------------
insert /*+gather_plan_statistics */into test.tmp3 select * from
test.tmp2
?
Plan hash value: 1016474986
?
-------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time | Buffers | Reads |
-------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | |
?
这次insert逻辑读为36872,是正常INSERT逻辑读2989的10倍以上 !!!
?
SQL> oradebug event 10046 trace name context off
Statement processed.
?
7. 观察10046递归sql
?
[oracle@test ~]$ tkprof /app/oracle/diag/rdbms/db19c/db19c/trace/db19c_ora_2604.trc tk.txt
?
TKPROF: Release 19.0.0.0.0 - Development on Wed Nov 18 20:43:10 2020
?
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
?
sql_id b52m6vduutr8j
delete from RecycleBin$ where bo=:1
?
********************************************************************************
?
SQL ID: b52m6vduutr8j Plan Hash: 716146596
?
delete from RecycleBin$
where
bo=:1
?
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.13 0.13 15807 16888 13 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.13 0.13 15807 16888 13 1
?
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: CHOOSE
Parsing user id: SYS (recursive depth: 1)
Number of plan statistics captured: 1
?
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
0 0 0 DELETE RECYCLEBIN$ (cr=16888 pr=15807 pw=0 time=131249 us starts=1)
1 1 1 TABLE ACCESS FULL RECYCLEBIN$ (cr=16888 pr=15801 pw=0 time=130870 us starts=1 cost=2 size=52 card=1)
?
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
db file sequential read 30 0.00 0.00
db file scattered read 1352 0.00 0.02
****************************************
?
可以从trace中看到这样一条SQL,执行了一次,full scan,逻辑读16888,加上其它一些递归sql最终导致insert 逻辑读暴增!
?
表空间紧张,递归清理回收站大概逻辑
使用以下SQL查询该表空间中可以清理的回收站对象。按dropscn排序,最小drop的最先清理。
select obj#, type#, flags, related, bo, purgeobj, con# from RecycleBin$ where ts#=:1 and to_number(bitand(flags, 16)) = 16 order by dropscn
?
2. purge相关段
?
3. delete RecycleBin$
delete from RecycleBin$ where bo=:1
?
?
解决方法
mos上有一遍说明了purge时该递归sql的性能问题,并建议在RecycleBin$(bo)上创建索引。
Purging RECYCLEBIN Running Fosrever (Doc ID 2284986.1)
Create new index on bo column:
create index RecycleBin$_bo on RecycleBin$(bo);
?
?
2. Gather stats on RecycleBin$ table and indexes:
exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'RecycleBin#39;, cascade=>TRUE);
?
墨天轮原文链接:https://www.modb.pro/db/40753
作者
范计杰,云和恩墨技术顾问,5年大型ORACLE数据库维护经验,擅长性能调优、故障处理等。
?
猜你喜欢
- 2024-11-07 【MySQL】MySQL常用命令速查表 mysql常用命令语句
- 2024-11-07 Linux下使用rsync进行数据备份的命令详解
- 2024-11-07 oracle执行计划分析(下) oracle执行计划作用
- 2024-11-07 分享一个有趣的sql--获取一个表的所有字段名并用逗号分割
- 2024-11-07 Oracle数据库AWR部分报告说明 oracle的awr报告
- 2024-11-07 mysql 遍历特定节点的所有子节点 mysql 递归查询所有子节点
- 2024-11-07 测试深度学习库中的Oracle近似研究
- 2024-11-07 Oracle AWR解析-Report Summary oracle awr ash
- 2024-11-07 oracle的start with connect by prior如何使用
你 发表评论:
欢迎- 617℃几个Oracle空值处理函数 oracle处理null值的函数
- 610℃Oracle分析函数之Lag和Lead()使用
- 599℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 595℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 591℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 582℃【数据统计分析】详解Oracle分组函数之CUBE
- 572℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 560℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)