【发布时间】:2020-11-05 13:49:34
【问题描述】:
我创建了一个触发器,它根据另一列 (colY) 中的值更新表中的列 (比如 colX)。 colY 可以插入或更新,如果 colX 为空,则应将其设置为 colY 的值。问题是我有一个文件上传,它在此表中插入大量记录并填充 colY。大多数情况下 colX 也已填充,但如果未填充,我希望此触发器为我完成。这是我的触发器:
CREATE OR REPLACE TRIGGER T_FILLCOLY
BEFORE INSERT OR UPDATE ON TAB1
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
if (:new.COLX is not null and :new.COLY is null) then
:new.COLY:= :new.COLX;
end if;
if (:new.COLA is not null and :new.COLBis null) then
:new.COLB := :new.COLA;
end if;
END;
/
有什么方法可以让这个触发器更快?现在上传时间是没有触发器的情况下的两倍。谢谢。
【问题讨论】:
-
我认为不会提供更快的案例,因为没有 DML,因此当前操作没有成本。顺便说一句,你真的认为这样的设计吗,因为持有一个已经可以从其他列中计算出来的列,几乎没有意义。
-
我不确定,但请尝试
when子句并将您的两个条件都放在 OR 中并使用相同的触发器进行检查。 -
嗨@BarbarosÖzhan 我同意,这不是最佳方法。我正在使用一个已经投入生产的系统并且没有很多选择。我们目前所做的另一个选项是在上传后运行更新查询,而且速度非常快。唯一的缺点是它的手册,我们有忘记运行脚本的风险。触发器可以避免这种情况。
-
触发器本质上是逐行操作,而您之前执行的更新是批量操作。我最好的猜测是触发器总是会慢很多,只是因为这个基本的区别。
-
感谢您的回复@pmdba,我也很怀疑。我希望如果有什么我可以做的事情可以使触发器在所有行都更新后执行。我知道这不是语句级触发器的正确候选者,但也许还有其他类似的东西。
标签: sql oracle triggers sql-tuning