[20150803]触发器对dml的影响.txt

[20150803]触发器对dml的影响.txt

--最近做一个优化项目,这个项目实际上ETL项目,里面出现如下语句:
UPDATE patient_medical_cost t
   SET t.total_costs = NVL (total_costs, 0),
       t.drug_west_costs = NVL (drug_west_costs, 0),
       t.drug_middle_costs = NVL (drug_middle_costs, 0),
       t.drug_anti_costs = NVL (drug_anti_costs, 0)
WHERE    total_costs IS NULL
       OR drug_west_costs IS NULL
       OR drug_middle_costs IS NULL
       OR drug_anti_costs IS NULL;

--这个本来应该在整合的抽取时就应该做好设置为0,根本不应该在进入表在做处理,而是通过索引的方式来处理不是很好.
--目前我想测试看看触发器对插入的影响.

1.建立测试环境:
SCOTT@test01p> @ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

create table t (id number ,x1 number ,x2 number ,x3 number ,x4 number);

2.无触发器的情况:

set timing on
insert into t select rownum ,0,0,0,0 from xmltable('1 to 10000000');
truncate table t
commit ;

--3次测试(第1次忽略,实际上也是这个时间):
Elapsed: 00:00:34.28
Elapsed: 00:00:36.28
Elapsed: 00:00:35.68
Elapsed: 00:00:32.21

4.建立触发器:
--从我自己管理数据库的角度,我非常不喜欢触发器.我一直认为这种情况是不得以而为之.

CREATE OR REPLACE TRIGGER tri_t_null_0
BEFORE INSERT
ON T
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
   :NEW.X1 := nvl(:new.x1,0);
   :NEW.X2 := nvl(:new.x2,0);
   :NEW.X3 := nvl(:new.x3,0);
   :NEW.X4 := nvl(:new.x4,0);
   EXCEPTION
     WHEN OTHERS THEN
       RAISE_APPLICATION_ERROR(-20002, 'insert into t error!');
       RAISE ;
END tri_t_null_0;
/

set timing on
insert into t select rownum ,NULL,NULL,NULL,NULL from xmltable('1 to 10000000');
truncate table t
commit ;

Elapsed: 00:01:18.35
Elapsed: 00:01:20.09
Elapsed: 00:01:19.66

5.对比可以发现:

79/34=2.3,使用触发器会慢2.3倍,看来不能考虑触发器的解决方式.

6.12c有1个新特性,可以让缺省值等于特定值.也测试看看:

SCOTT@test01p> drop trigger tri_t_null_0;
Trigger dropped.

alter table t modify(x1  default on null 0);
alter table t modify(x2  default on null 0);
alter table t modify(x3  default on null 0);
alter table t modify(x4  default on null 0);

set timing on
insert into t select rownum ,NULL,NULL,NULL,NULL from xmltable('1 to 10000000');
truncate table t
commit ;

Elapsed: 00:00:32.13
Elapsed: 00:00:28.46
Elapsed: 00:00:33.14

--基本与无触发器一致.

SCOTT@test01p> @ddl scott.t
C100
--------------------------------------------------------
  CREATE TABLE "SCOTT"."T"
   (    "ID" NUMBER,
        "X1" NUMBER DEFAULT 0 NOT NULL ENABLE,
        "X2" NUMBER DEFAULT 0 NOT NULL ENABLE,
        "X3" NUMBER DEFAULT 0 NOT NULL ENABLE,
        "X4" NUMBER DEFAULT 0 NOT NULL ENABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

时间: 2024-09-20 10:43:05

[20150803]触发器对dml的影响.txt的相关文章

SQL Server实现用触发器捕获DML操作的会话信息【实例】

需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢? 解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,Host_Name.Program_Name等 ,选择触发器是因为

[20171028]测试大量子光标对性能影响.txt

[20171028]测试大量子光标对性能影响.txt --//做一个测试例子说明存在大量子光标对性能影响. 1.环境: SCOTT@test01p> @ ver1 PORT_STRING                    VERSION        BANNER                                                                               CON_ID ------------------------------

[20170421]警惕打开IMU对测试的影响.txt

[20170421]警惕打开IMU对测试的影响.txt --这一系列的问题都来源与IMU有关,我以前的测试环境都是dg环境,使用dgmgrl管理,为了一些测试切换我两边数据库都打开flashback, --这样IMU是失效的. --问题起源别人重复测试,无法还原我当时的测试结果. [20140507]实例crash恢复.txt => http://blog.itpub.net/267265/viewspace-1156043/ --于是我重复测试,链接 [20170322]实例crash恢复2.

[20151203]关于grd对性能影响.txt

[20151203]关于grd对性能影响.txt --前几天写了1篇,统计分析对grd的影响,提到一些大表在晚上分析后会出现资源重新分配,参考链接 --blog.itpub.net/267265/viewspace-1851145/ --我们的生产系统业务并不是很忙,今天做一点"危险"的测试,让另外1个实例掌控某些另外实例经常访问的对象. --先看看没有切换的awr报表(昨天的10-11点)rac部分: RAC Statistics  DB/Inst: xxxx/xxxx1  Snap

[20120523]关于11GR2无法通过logminer看到DML的问题.txt

[20120523]关于11GR2无法通过logminer看到DML的问题.txt 昨天工作需要,使用logminer挖掘一些dml信息,我发现漏掉一些信息,也就是一些dml语句无法抓取.我在测试环境做了一些测试(我的测试环境11.2.0.1),btw,这个问题也存在10.2.0.4版本中. 1.测试脚本: SQL> select * from v$version BANNER -----------------------------------------------------------

SQL Server如何用触发器捕获DML操作的会话信息

需求背景        上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢?   解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,Host_Name.Program_Name等

关于MySQL建表对DML的影响

今天一位同学问到线上曾经碰到过连续建表,导致阻塞普通的insert.update等.不过也没有保留现场.因此有疑问为什么建表会影响DML?   分析          首先这个现象不是在所有场景都会碰到(否则MySQL的用户们早就跳起来了). 一来建表这个操作本身很快,只涉及到写表定义文件和初始化表空间.中间涉及到redo和undo的操作也很少(这里只讨论InnoDB表).因此除非碰到磁盘IO响应不了,否则多数情况下建表操作很快结束,不会"稳定复现" 二来即使由于io原因,建表过程执行

PL/SQL --> DML 触发器

--======================= -- PL/SQL --> DML 触发器 --=======================         何谓触发器?简言之,是一段命名的PL/SQL代码块,只不过该代码块在特定的条件下被触发并且执行.对于这样的代码我们称之为触发器 .触发器根据触发类型的不同又分为不同级别的触发器,下面将给出触发器的分类,定义,以及使用的示例.   一.触发器的相关概念     1.触发器的分类         通常根据触发条件以及触发级别的不同分为DM

PL/SQL12.1 ——DML 触发器

 http://blog.csdn.net/robinson_0612/article/details/6098258  何谓触发器?简言之,是一段命名的PL/SQL代码块,只不过该代码块在特定的条件下被触发并且执行.对于这样的代码我们称之为触发器 .触发器根据触发类型的不同又分为不同级别的触发器,下面将给出触发器的分类,定义,以及使用的示例.   一.触发器的相关概念     1.触发器的分类         通常根据触发条件以及触发级别的不同分为DML触发器,INSTEAD OF 触发器,系