2017-12-13 17 views
0
Iは、SQL Server 2005を使用しています

私は、このタスクファイルのテーブルを持っていますファイルのすべてが状態3(完了)にある場合、相対ファイルの状態は4(完了)でなければならない。SQL Serverのトリガもパフォーマンス

タスクテーブルのトリガを追加することでこの問題を解決しようとしましたが、タスクテーブルの更新が数秒になる可能性があり、データベース接続の問題が発生するため、パフォーマンスに満足できません。

私が書いたトリガは、このクエリは平均200ミリ秒になります

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 

です。

リスソリューションを使用すると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 
+0

これはあなたの現在のトリガーであり、それは働いていますか? – Squirrel

+0

@Squirrelいいえ、私はそれを停止し、質問のために少し変更しました。 – overcomer

答えて

1

私はあなたを理解希望が正しく

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 
     ) 
関連する問題