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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB触发条件是否可以提高性能?相关的知识,希望对你有一定的参考价值。

我知道数据库触发条件只能是一个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_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

以上是关于DB触发条件是否可以提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

未触发opengl片段着色器条件语句

是否可以动态编译和执行 C# 代码片段?

通过多重连接提高最大 n 的性能

sqlserver 2005 触发器,的小问题

如何提高应用性能?