我知道数据库触发条件只能是一个SQL表达式,并且它不能包含子查询。但是,在触发器代码中,可以使用PL / SQL和子查询。我想这可能是因为使用触发条件,在适用的情况下,我们可以获得更好的性能(例如,可能保存SQL引擎和PL / SQL之间的上下文切换)。
例如,使用我们的触发条件:
CREATE TRIGGER hr.salary_check
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees
FOR EACH ROW
WHEN (new.job_id <> 'AD_VP')
BEGIN
--pl/sql_block
END;
并且没有使用我们的触发条件:
CREATE TRIGGER hr.salary_check
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees
FOR EACH ROW
BEGIN
IF (new.job_id <> 'AD_VP') THEN
--pl/sql_block
END IF;
END;
使用数据库触发条件以避免执行代码并在触发器代码中的“IF”语句中使用相同的条件以避免执行该代码之间的性能是否存在差异?如果是这样,我会感谢您对性能影响的评论。
只需做一个简单的测试和测量时间。
CREATE TABLE employees_0 AS
SELECT
x * employee_id as employee_id,
first_name,
last_name,
email,
phone_number,
hire_date,
'AD_VP' As job_id,
salary,
commission_pct,
manager_id,
department_id
FROM
employees
CROSS JOIN (
SELECT level as x FROM dual CONNECT BY LEVEL <= 10000
) x
;
CREATE TABLE employees_1 AS SELECT * FROM employees_0;
CREATE TABLE employees_2 AS SELECT * FROM employees_0;
CREATE OR REPLACE TRIGGER hr.salary_check_1
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees_1
FOR EACH ROW
WHEN (new.job_id <> 'AD_VP')
BEGIN
:new.salary := :new.salary + 1;
END;
/
CREATE TRIGGER hr.salary_check_2
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees_2
FOR EACH ROW
BEGIN
IF (:new.job_id <> 'AD_VP') THEN
:new.salary := :new.salary + 1;
END IF;
END;
/
现在:
set timing on;
update employees_0 set salary = salary + 2;
update employees_1 set salary = salary + 2;
update employees_2 set salary = salary + 2;
结果是:
1 070 000 rows updated.
Elapsed: 00:00:37.273
1 070 000 rows updated.
Elapsed: 00:00:37.232
1 070 000 rows updated.
Elapsed: 00:00:38.874
测试表明,在没有触发器的表和具有两种触发器版本的表之间存在可忽略的差异,而对于所有行的列job_id
与AD_VP
不同的表执行UPDATE。
您可以自己对这些测试表执行其他测量 - 例如INSERT 1 mln。行,将job_id
的值更改为AD_VP
并执行更新等。
我的系统是:
select * from v$version;
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE 12.1.0.2.0 Production"
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production