千家信息网

Oracle 性能优化-trigger问题

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,Oracle 性能优化-trigger问题问题现象 :谓词通过唯一性索引,更新一条记录,耗时很长;通过 AWR 查看 TOP SQL ,这个UPDATE SQL 语句逻辑读,物理读等都 非常高;初步怀
千家信息网最后更新 2025年01月21日Oracle 性能优化-trigger问题

Oracle 性能优化-trigger问题

问题现象 :

谓词通过唯一性索引,更新一条记录,耗时很长;

通过 AWR 查看 TOP SQL ,这个UPDATE SQL 语句逻辑读,物理读等都 非常高

初步怀疑执行计划出现变化, index unique scan 变成 table access full ,但是通过 DBA_HIST_SQL_PLAN 发现近期执行计划并没有改变;

通过 10046 查看 SQL 执行计划,显示这个更新语句耗时,逻辑读,物理读等都 非常低

问题原因 :

触发器导致的;

更新语句 A 执行前,触发了 trigger B ,其中 trigger B 内部执行较慢,导致 A 一直在等待;

由于 trigger B 执行过程中占用大量的资源,在 AWR 中会将 trigger 消耗的资源也加到 update 语句上,有时可能会干扰问题诊断;

问题结论:

当发现某个语句执行突然变慢了,执行时间,逻辑读,物理读等突然飙升,

在排查数据量,执行计划等都没有异常,可以查看是否存在不合理的触发器;

问题重现举例 :

---1 创建测试用户

SQL> create user c##chenjch identified by a;

SQL> grant connect,resource,dba to c##chenjch;

---2 创建测试表,索引并插入数据

SQL> create table test01(id number);

SQL> create table test02 as select * from dba_objects;

SQL>

begin

for i in 1 .. 100000 loop

insert into test01 values (i);

commit;

end loop;

end;

SQL> create unique index ui_test_id on test01(id);

SQL> insert into test02 select * from test02;

SQL> commit;

/

/

......

select count(*) from test02; ---2329536

---3 创建触发器

SQL>

create or replace trigger TG_TEST01_UPDATE

BEFORE UPDATE ON TEST01

for each row

begin

insert into test02

SELECT * FROM TEST02;

end;

---4 生成快照

SQL>

begin

dbms_workload_repository.create_snapshot;

end;

SQL>

select SNAP_ID, BEGIN_INTERVAL_TIME, FLUSH_ELAPSED, SNAP_LEVEL

from dba_hist_snapshot

order by snap_id desc;

---5 update test01 通过唯一性索引,更新一条数据

SQL> set timing on

SQL> set autotrace on

SQL> alter session set tracefile_identifier='10046';

Session altered.

Elapsed: 00:00:00.00

SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';

Session altered.

Elapsed: 00:00:00.03

---耗时19秒

SQL> update test01 set id=1000000000 where id=1;

1 row updated.

Elapsed: 00:00:19.49

Execution Plan

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

Plan hash value: xxxxx

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

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

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

| 0 | UPDATE STATEMENT | | 1 | 13 | 1 (0)| 00:00:01

| 1 | UPDATE | TEST01 | | | |

|* 2 | INDEX UNIQUE SCAN| UI_TEST_ID | 1 | 13 | 1 (0)| 00:00:01

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

Predicate Information (identified by operation id):

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

2 - access("ID"=1)

Statistics

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

637 recursive calls

351598 db block gets

103565 consistent gets

38393 physical reads

374300700 redo size

858 bytes sent via SQL*Net to client

962 bytes received via SQL*Net from client

3 SQL*Net roundtrips to/from client

102 sorts (memory)

0 sorts (disk)

1 rows processed

SQL> ALTER SESSION SET EVENTS '10046 trace name context off';

Session altered.

Elapsed: 00:00:00.01

SQL> select value from v$diag_info where name='Default Trace File';

VALUE

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

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_56542_10046.trc

Elapsed: 00:00:00.06

SQL> @?/rdbms/admin/awrrpt.sql

AWR显示update语句消耗资源很高

select * from table(dbms_xplan.display_cursor('afqfknn3nwwpw'));

10046 显示update语句消耗的资源很少;

欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!


语句 问题 资源 更新 数据 物理 索引 触发器 逻辑 消耗 唯一性 测试 性能 不合理 公众 原因 快照 时间 现象 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 vc中组合框如何添加数据库 云服务器装qt 我的世界服务器怎么与qq群互通 网络安全包括安全管理及 中信银行软件开发中心题目 广电网络技术招聘面试 山东标准网络技术服务怎么样 举办网络安全知识 软件开发技术ppt演讲 百度云三级网络技术 广西网络安全法第四十四条案例 董文磊网络安全 吉林网络技术服务质量保证 网络安全自身的安全缺陷 南开网络安全攻防基础期末 国家中小学网络安全教育 我的世界大神极限生存服务器 csgo社区服务器僵尸逃跑地图 农业方面的软件开发公司 路南区项目网络技术诚信合作 打印机服务器管理下载不了 北京智慧园区软件开发方案 手机游戏云服务器都是怎么做的 2019全球服务器与存储市场 数据库开发对企业的影响 服务器本地连接属性在哪里 国外对网络安全的研究综述 精英时代网络技术 查询数据库字符串语句 免疫学数据库
0