SQL 服务器触发器性能
SQL Server trigger performance
我正在使用 SQL Server 2005。我有这个 table 任务文件:
和 table 个任务:
当一个文件的所有任务都处于状态3(已完成)时,相关文件的状态必须为4(已完成)。
我尝试在任务 table 上添加触发器来解决这个问题,但我对性能不满意,因为任务 table 的更新每秒可能有几次,而且我获取数据库连接问题。
我写的触发器是
CREATE TRIGGER [dbo].[tr_set_file_to_worked]
ON [dbo].[PROD_TASK]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
;WITH ToUpdate AS
(
SELECT
pf.id_file, pt.id_state, COUNT(*) AS tasks
FROM
prod_task pt
LEFT JOIN
prod_file pf ON (pt.ID_FILE = pf.ID_FILE)
GROUP BY
pf.id_file, pt.id_state
);
UPDATE pf
SET pf.ID_STATE = 4
FROM prod_file pf
INNER JOIN inserted ins ON (pf.Id_file = ins.id_file)
AND NOT EXISTS (SELECT *
FROM ToUpdate tu
INNER JOIN inserted ins ON (tu.id_file = ins.ID_FILE)
WHERE tu.id_state <> 3);
END
此查询平均需要 200 毫秒。
使用 Squirrel 解决方案需要 20 毫秒。
UPDATE pf
SET ID_STATE = 4
FROM inserted i
INNER JOIN PROD_FILE pf ON pt.ID_FILE = pf.ID
LEFT JOIN PROD_TASK pt ON (i.ID_FILE = pt.ID_FILE AND pt.ID_STATE <> 3)
WHERE i.ID_STATE = 3 AND pt.ID_TASK is NULL
希望我理解正确
UPDATE pf
SET ID_STATE = 4
FROM inserted i
INNER JOIN PROD_TASK pt ON i.ID_FILE = pt.ID_FILE
INNER JOIN PROD_FILE pf ON pt.ID_FILE = pf.ID
WHERE i.ID_STATE = 3
AND NOT EXISTS
(
SELECT *
FROM PROD_TASK x
WHERE x.ID_FILE = i.ID_FILE
AND x.ID_STATE <> 3
)
我正在使用 SQL Server 2005。我有这个 table 任务文件:
和 table 个任务:
当一个文件的所有任务都处于状态3(已完成)时,相关文件的状态必须为4(已完成)。
我尝试在任务 table 上添加触发器来解决这个问题,但我对性能不满意,因为任务 table 的更新每秒可能有几次,而且我获取数据库连接问题。
我写的触发器是
CREATE TRIGGER [dbo].[tr_set_file_to_worked]
ON [dbo].[PROD_TASK]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
;WITH ToUpdate AS
(
SELECT
pf.id_file, pt.id_state, COUNT(*) AS tasks
FROM
prod_task pt
LEFT JOIN
prod_file pf ON (pt.ID_FILE = pf.ID_FILE)
GROUP BY
pf.id_file, pt.id_state
);
UPDATE pf
SET pf.ID_STATE = 4
FROM prod_file pf
INNER JOIN inserted ins ON (pf.Id_file = ins.id_file)
AND NOT EXISTS (SELECT *
FROM ToUpdate tu
INNER JOIN inserted ins ON (tu.id_file = ins.ID_FILE)
WHERE tu.id_state <> 3);
END
此查询平均需要 200 毫秒。
使用 Squirrel 解决方案需要 20 毫秒。
UPDATE pf
SET ID_STATE = 4
FROM inserted i
INNER JOIN PROD_FILE pf ON pt.ID_FILE = pf.ID
LEFT JOIN PROD_TASK pt ON (i.ID_FILE = pt.ID_FILE AND pt.ID_STATE <> 3)
WHERE i.ID_STATE = 3 AND pt.ID_TASK is NULL
希望我理解正确
UPDATE pf
SET ID_STATE = 4
FROM inserted i
INNER JOIN PROD_TASK pt ON i.ID_FILE = pt.ID_FILE
INNER JOIN PROD_FILE pf ON pt.ID_FILE = pf.ID
WHERE i.ID_STATE = 3
AND NOT EXISTS
(
SELECT *
FROM PROD_TASK x
WHERE x.ID_FILE = i.ID_FILE
AND x.ID_STATE <> 3
)