【发布时间】:2019-12-17 13:24:11
【问题描述】:
我正在使用 Oracle 数据库。请参阅以下 2 个示例(完全相同):
1.
CREATE OR REPLACE TRIGGER LAST_CHANGE_TRIGGER
BEFORE INSERT
ON TABLE_X_HAVING_ITEM_ID
FOR EACH ROW
DECLARE
style_id NUMBER(18);
BEGIN
-- 1. get style_id
SELECT
ITEM.STYLE_ID
INTO
style_id
FROM
ITEM
WHERE
ITEM.ITEM_ID = :NEW.ITEM_ID;
-- 2. set last_modified
UPDATE
STYLE
SET
STYLE.LAST_MODIFIED = SYSDATE
WHERE
STYLE.STYLE_ID = style_id;
END;
/
2.
CREATE OR REPLACE TRIGGER LAST_CHANGE_TRIGGER
BEFORE INSERT
ON TABLE_X_HAVING_ITEM_ID
FOR EACH ROW
BEGIN
UPDATE
STYLE
SET
STYLE.LAST_MODIFIED = SYSDATE
WHERE
STYLE.STYLE_ID = (
SELECT
ITEM.STYLE_ID
FROM
ITEM
WHERE
ITEM.ITEM_ID = :NEW.ITEM_ID
);
END;
/
我听说 2. 一个会更快。我认为 1. 更容易理解(更直接)。 你能解释/证明 2. 更快吗?如果可以的话,是不是只有oracle才有这种情况?
【问题讨论】:
-
与性能无关,但是:分配
item_id := :NEW.ITEM_ID;完全没用。您可以在 SQL 语句中直接使用:NEW.ITEM_ID。 -
在我的代码中,我有一个分配 item_id 的 IF-ELSE 块。我把它留给了stackoverflow,但我忘了删除分配:)
-
只是仔细检查...
TABLE_X_HAVING_ITEM_ID不同于item和style,对吧?向第三个表添加一行会导致设置style表的last_modified似乎很奇怪——通常你会认为只有在style表本身发生更改时才会发生这种情况。跨度> -
嘿贾斯汀,也许我不应该从 TABLE_X_HAVING_ITEM_ID 中删除真实姓名。它的名字叫ITEMOPTION,所以它确实属于一种风格!
标签: sql oracle performance triggers