2016-07-08 9 views
0

これは、SQLite3の条件付きトリガに関連しています。条件付きトリガのパフォーマンスが改善されていませんか?

CREATE TRIGGER AfterUpdateOnTWhen1 
AFTER UPDATE ON T 
WHEN new.value = 1 
BEGIN 
    UPDATE TABLE T1 SET VALUE = new.value; 
END; 

CREATE TRIGGER AfterUpdateOnTWhen2 
AFTER UPDATE ON T 
WHEN new.value = 2 
BEGIN 
    UPDATE TABLE T2 SET VALUE = new.value; 
END; 

AND SO:

はそれのように、様々なトリガにそれらを分割しても意味がない、私はそう

CREATE TRIGGER AfterUpdateOnT 
AFTER UPDATE ON T 
FOR EACH ROW 
BEGIN 

    Update table T1 where new.value = 1; 
    Update table T2 where new.value = 2; 
    . 
    . 
    . 
    . 
END; 

としてテーブルTに更新トリガーを持っていること、例えば、考えてみましょうに。業績改善に役立つと思われますか?

+0

おそらくこれは 'condition'チェックです。 –

+0

私は、特定の条件を満たすだけで条件トリガが呼び出されることを確認した後、質問を修正しました。 –

答えて

0

特定のWHEN句が役立つかどうかは、同等のWHERE句をどれだけ最適化できるかによって異なります。

この特定のケースでは、WHERE new.value = 1フィルタは、trueでない場合、UPDATE文の実行全体をショートカットします。そのため、同じパフォーマンスが必要です。

一般的に、WHEREフィルタはクエリ内の他の条件と組み合わせられているため、最適化できない可能性があります。

WHENを使用するとWHEREよりパフォーマンスが低下しない状況はないため、パフォーマンスを気にする場合はWHENを使用してください。 しかし、トリガを2つに分割すると、スキーマが複雑になるため、実際にパフォーマンスに問題がある場合や、別のWHEN句が何が起こっているかを正しく文書化している場合にのみ、これを行う必要があります。

+0

複数のテストで、これらを複数のトリガーに分割することで改善がないことを確認しました。トリガーの分割は、保守と文書化のオーバーヘッドです。したがって、私はこの解答を受け入れます。なぜなら、「実行のショートカット」についてのあなたの説明に同意するからです。 –

関連する問題