2016-07-08 3 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; 

및 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

아마도 이것은 '조건'검사 일 것입니다. –

+0

특정 조건을 충족 한 후에 만 ​​조건부 트리거가 호출되는지 확인한 후 질문을 수정했습니다. –

답변

0

특정 WHEN claus가 도움이되는지 여부는 WHERE 절이 최적화 될 수있는 정도에 따라 다릅니다.

이 경우, WHERE new.value = 1 필터는 true가 아닌 경우 UPDATE 구문의 전체 실행을 바로 가기 때문에 동일한 성능을 가져야합니다.

일반적으로 WHERE 필터는 쿼리의 다른 조건과 결합되므로 최적화 할 수 없습니다.

WHEN을 사용하면 WHERE보다 성능이 떨어지지 않으므로 성능을 신경 쓰는 경우 WHEN을 사용해야합니다. 그러나 트리거를 두 개로 분할하면 스키마가 더 복잡해 지므로 실제로 성능 문제가 있거나 개별 WHEN 절이 무슨 일이 일어나는지 더 잘 문서화 된 경우에만이 작업을 수행해야합니다.

+0

여러 테스트를 통해 여러 트리거로 분할하여 개선되지 않았 음을 확인했습니다. 트리거 분리는 유지 보수 및 문서 작성의 오버 헤드입니다. 이제는 "실행 단축키"에 대한 귀하의 설명에 동의하므로이 대답을 수락합니다. –

관련 문제