트리거를 사용하여 수행할 수 있는 많은 작업은 다음을 사용하여 구현되었습니다.포스트그레스규칙 시스템. 현재 규칙으로 구현할 수 없는 것은 다음과 같습니다. 어떤 종류의 제약. 자격을 갖춘 배치가 가능합니다. 열의 값이 다음과 같은 경우 쿼리를 NOTHING으로 다시 작성하는 규칙 다른 테이블에는 나타나지 않습니다. 하지만 데이터는 자동으로 버려지는 것은 좋은 생각이 아닙니다. 유효한지 확인하는 경우 값은 필수이며 잘못된 값의 경우 오류가 발생합니다. 메시지가 생성되어야 하며, 이는 트리거에 의해 수행되어야 합니다. 지금.
반면에 뷰의 INSERT에 실행되는 트리거 스포츠 토토과 동일한 작업을 수행하고 데이터를 다른 곳에 배치할 수 있으며 뷰에서 삽입을 억제합니다. 하지만 같은 일을 할 수는 없습니다 UPDATE 또는 DELETE 시, 뷰에 실제 데이터가 없기 때문입니다. 스캔할 수 있는 관계이므로 트리거는 절대 발생하지 않습니다. 전화를 받으세요. 스포츠 토토만이 도움이 될 것입니다.
두 가지 모두에 의해 구현될 수 있는 것은 다음에 달려 있습니다. 데이터베이스 사용이 가장 좋습니다. 방아쇠가 발사되었습니다. 한 번 영향을 받은 모든 행에 대해. 규칙은 구문 분석 트리를 조작하거나 추가로 생성합니다. 따라서 하나의 행에 많은 행이 영향을 받는 경우 문에서 하나의 추가 쿼리를 발행하는 규칙은 일반적으로 다음을 수행합니다. 단일 행에 대해 호출되는 트리거보다 더 나은 작업이며 그의 작업을 여러 번 실행해야 합니다.
예: 두 개의 테이블이 있습니다.
테이블 컴퓨터 생성(
호스트 이름 텍스트 - 색인화됨
제조업체 텍스트 - 색인화됨
);
CREATE TABLE 소프트웨어(
소프트웨어 텍스트, -- 색인화됨
호스트 이름 텍스트 - 색인화됨
);두 테이블 모두 수천 개의 행을 갖고 있으며 인덱스는
호스트 이름은 고유합니다. 호스트 이름 열에는 정규화된 전체 이름이 포함되어 있습니다.
컴퓨터의 도메인 이름입니다. 규칙/트리거는 제약을 가해야 합니다.
삭제된 호스트를 참조하는 소프트웨어에서 행을 삭제합니다. 이후
트리거는 삭제된 각 개별 행에 대해 호출됩니다.
컴퓨터에서는 다음 명령문을 사용할 수 있습니다.호스트 이름 = $1인 소프트웨어에서 삭제;준비되고 저장된 계획에 호스트 이름을 전달합니다. 매개변수. 규칙은 다음과 같이 작성됩니다.
컴퓨터 삭제 시 스포츠 토토computer_del 생성
호스트 이름 = OLD.hostname인 소프트웨어에서 삭제하세요.이제 다양한 유형의 삭제를 살펴보겠습니다. a의 경우호스트 이름 = 'mypc.local.net'인 컴퓨터에서 삭제;테이블 컴퓨터는 인덱스(빠름)로 스캔되고 쿼리 트리거에 의해 발행된 인덱스 스캔도 가능합니다(너무 빠릅니다). 는 규칙의 추가 쿼리는 다음과 같습니다.
computer.hostname = 'mypc.local.net'인 소프트웨어에서 삭제
AND 소프트웨어.호스트 이름 = 컴퓨터.호스트 이름;적절한 인덱스 설정이 있으므로 플래너는
계획을 세우다네스트루프
- 컴퓨터에서 comp_hostidx를 사용하여 인덱스 스캔
- 소프트웨어에서 Soft_hostidx를 사용한 인덱스 스캔그래서 두 제품 사이의 속도에는 그다지 큰 차이가 없을 것입니다.
트리거 및 규칙 구현. 다음 삭제에서는
호스트 이름이 시작되는 2000대의 컴퓨터를 모두 제거하고 싶습니다.
'늙은'으로. 이를 수행하기 위한 두 가지 가능한 쿼리가 있습니다. 하나는호스트 이름 = '이전'인 컴퓨터에서 삭제
AND 호스트 이름 < 'ole'규칙 쿼리에 대한 계획은 다음과 같습니다.해시 조인
- 소프트웨어의 서열 스캔
- 해시
- 컴퓨터에서 comp_hostidx를 사용하여 인덱스 스캔다른 가능한 쿼리는 다음과 같습니다.호스트 이름 ~ '^old'가 있는 컴퓨터에서 삭제;실행 계획 포함
네스트루프
- 컴퓨터에서 comp_hostidx를 사용하여 인덱스 스캔
- 소프트웨어에서 Soft_hostidx를 사용한 인덱스 스캔이것은 기획자가 다음을 인식하지 못한다는 것을 보여줍니다.
컴퓨터의 호스트 이름에 대한 자격은 다음 용도로도 사용될 수 있습니다.
여러 자격이 있는 경우 소프트웨어에 대한 색인 스캔
AND와 결합된 표현식, 정규 표현식 버전에서 수행하는 작업
쿼리의. 트리거는 2000개 중 하나에 대해 한 번 호출됩니다.
삭제해야 하는 오래된 컴퓨터로 인해
컴퓨터에 대한 인덱스 스캔과 소프트웨어에 대한 2000개의 인덱스 스캔. 는
규칙 구현에서는 인덱스에 대한 두 개의 쿼리를 사용하여 이를 수행합니다. 그리고
규칙이 적용되는 경우 소프트웨어 테이블의 전체 크기에 따라 달라집니다.
seqscan 상황에서는 여전히 더 빠릅니다. 2000년 쿼리
SPI 관리자를 통한 실행에는 시간이 좀 걸립니다.
이를 조회하기 위한 인덱스 블록이 곧 캐시에 나타날 것입니다.우리가 보는 마지막 쿼리는 a
manufacurer = 'bim'인 컴퓨터에서 삭제;이로 인해 많은 행이 삭제될 수 있습니다. 컴퓨터. 따라서 트리거는 다시 많은 쿼리를 실행합니다. 집행자. 하지만 스포츠 토토 계획은 다시 Nestloop가 될 것입니다. 인덱스스캔. 컴퓨터에서 다른 인덱스만 사용:
네스트루프
- 컴퓨터에서 comp_manufidx를 사용하여 인덱스 스캔
- 소프트웨어에서 Soft_hostidx를 사용한 인덱스 스캔스포츠 토토 쿼리의 결과computer.manufacurer = 'bim'인 소프트웨어에서 삭제
AND 소프트웨어.호스트 이름 = 컴퓨터.호스트 이름;이러한 경우에는 스포츠 토토 시스템의 추가 쿼리가
영향을 받는 행 수와 다소 독립적입니다.
쿼리에서.또 다른 상황은 업데이트에 따라 달라지는 경우입니다. 작업을 수행해야 하는지 여부에 따라 속성이 변경됩니다. 에서포스트그레버전 6.4, 규칙 이벤트에 대한 속성 사양이 비활성화되었습니다( 6.5에서 가장 최근에 컴백했으며 아마도 그 이전 버전일 수도 있습니다. 계속 지켜봐 주시기 바랍니다. 그래서 이제 shoelace_log 예제에서와 같이 규칙을 생성하는 유일한 방법입니다 규칙 자격을 사용하여 수행하는 것입니다. 그 결과 추가 비용이 발생합니다. 관심 있는 속성이 있는 경우에도 항상 수행되는 쿼리 대상 목록에 나타나지 않으므로 전혀 변경할 수 없습니다. 초기 쿼리 중. 이것이 다시 활성화되면 하나가 됩니다. 트리거보다 규칙이 더 유리합니다. 트리거 최적화 이 경우 정의에 따라 실패해야 합니다. 특정 속성이 업데이트될 때만 작업이 수행됩니다. 그 기능에 숨겨져 있습니다. 트리거만의 정의 행 수준에서 지정할 수 있으므로 행을 터치할 때마다 결정을 내리려면 트리거를 호출해야 합니다. 규칙 시스템 대상 목록을 검색하여 이를 알 수 있으며 해당 항목을 억제합니다. 속성이 터치되지 않은 경우 추가 쿼리가 완전히 수행됩니다. 그래서 적격 여부에 관계없이 규칙은 해당하는 경우에만 스캔을 수행합니다. 뭔가 할 일이 있을 수도 있겠네요.
규칙은 다음과 같은 경우에만 트리거보다 상당히 느립니다. 조치로 인해 크고 잘못된 자격을 갖춘 조인, 상황이 발생합니다. 기획자가 실패한 곳. 그들은 큰 망치입니다. 큰 것을 사용하여 주의 없이 망치질을 하면 큰 피해를 입을 수 있습니다. 그러나 오른쪽만 터치하면 머리에 못을 박을 수 있습니다.