DB触发条件是否可以提高性能?

问题描述 投票:1回答:1

我知道数据库触发条件只能是一个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”语句中使用相同的条件以避免执行该代码之间的性能是否存在差异?如果是这样,我会感谢您对性能影响的评论。

oracle triggers database-performance database-trigger
1个回答
2
投票

只需做一个简单的测试和测量时间。

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_idAD_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
© www.soinside.com 2019 - 2024. All rights reserved.