이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 39.7. 윈 토토 대 트리거버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

16.6. 스포츠 토토 대 트리거

트리거를 사용하여 수행할 수 있는 많은 작업은 다음을 사용하여 구현되었습니다.PostgreSQL규칙 시스템. 현재 규칙으로 구현할 수 없는 것은 다음과 같습니다. 어떤 종류의 제약. 자격을 갖춘 배치가 가능합니다. 열의 값이 다음과 같은 경우 쿼리를 NOTHING으로 다시 작성하는 규칙 다른 테이블에는 나타나지 않습니다. 하지만 데이터는 자동으로 버려지는 것은 좋은 생각이 아닙니다. 유효한지 확인하는 경우 값은 필수이며 잘못된 값의 경우 오류가 발생합니다. 메시지가 생성되어야 하며, 이는 트리거에 의해 수행되어야 합니다. 지금.

반면에 뷰의 INSERT에 실행되는 트리거 스포츠 토토과 동일한 작업을 수행하고 데이터를 다른 곳에 배치할 수 있으며 뷰에서 삽입을 억제합니다. 하지만 같은 일을 할 수는 없습니다 UPDATE 또는 DELETE 시, 뷰에 실제 데이터가 없기 때문입니다. 스캔할 수 있는 관계이므로 트리거는 절대 발생하지 않습니다. 전화를 받으세요. 스포츠 토토만이 도움이 될 것입니다.

두 가지 모두에 의해 구현될 수 있는 것은 다음에 달려 있습니다. 데이터베이스 사용이 가장 좋습니다. 방아쇠가 발사되었습니다. 한 번 영향을 받은 모든 행에 대해. 규칙은 구문 분석 트리를 조작하거나 추가로 생성합니다. 따라서 하나의 행에 많은 행이 영향을 받는 경우 문에서 하나의 추가 쿼리를 발행하는 규칙은 일반적으로 다음을 수행합니다. 단일 행에 대해 호출되는 트리거보다 더 나은 작업이며 그의 작업을 여러 번 실행해야 합니다.

예: 두 개의 테이블이 있습니다.

테이블 컴퓨터 생성(
    호스트 이름 텍스트, -- 색인화됨
    제조업체 텍스트 - 색인화됨
);

CREATE TABLE 소프트웨어(
    소프트웨어 텍스트, -- 색인화됨
    호스트 이름 텍스트 - 색인화됨
);

두 테이블 모두 수천 개의 행과 색인을 가지고 있습니다.호스트 이름고유합니다.호스트 이름열에는 정규화된 전체 내용이 포함되어 있습니다. 컴퓨터의 도메인 이름입니다. 규칙/트리거는 제약을 가해야 합니다. 삭제된 호스트를 참조하는 소프트웨어에서 행을 삭제합니다. 이후 트리거는 삭제된 각 개별 행에 대해 호출됩니다. 컴퓨터에서는 다음 명령문을 사용할 수 있습니다.

호스트 이름 = $1인 소프트웨어에서 삭제;

준비되고 저장된 계획에 따라 통과호스트 이름매개변수에 있습니다. 규칙은 다음과 같습니다. 다음과 같이 작성됨

컴퓨터 삭제 시 규칙computer_del 생성
    호스트 이름 = OLD.hostname인 소프트웨어에서 삭제하세요.

이제 다양한 유형의 삭제를 살펴보겠습니다. 의 경우 에

호스트 이름 = '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개의 인덱스 스캔. 규칙 구현 인덱스에 대한 두 개의 쿼리를 사용하여 이를 수행합니다. 그리고 그것은 규칙이 계속 유지되는 경우 소프트웨어 테이블의 전체 크기 순차 스캔 상황에서는 더 빠릅니다. 2000번의 쿼리 실행 SPI 관리자를 통해 모든 인덱스가 차단되더라도 시간이 좀 걸립니다. 검색하면 곧 캐시에 표시됩니다.

우리가 보는 마지막 쿼리는 a

manufacurer = 'bim'인 컴퓨터에서 삭제;

이로 인해 많은 행이 삭제될 수 있습니다. 컴퓨터. 따라서 트리거는 다시 많은 쿼리를 실행합니다. 집행자. 그러나 스포츠 토토 계획은 다시 중첩 루프가 됩니다. 두 개의 인덱스 스캔. 컴퓨터에서 다른 인덱스만 사용:

네스트루프
  - 컴퓨터에서 comp_manufidx를 사용하여 인덱스 스캔
  - 소프트웨어에서 Soft_hostidx를 사용한 인덱스 스캔

스포츠 토토 쿼리의 결과

computer.manufacurer = 'bim'인 소프트웨어에서 삭제
                       AND 소프트웨어.호스트 이름 = 컴퓨터.호스트 이름;

이러한 경우에는 스포츠 토토 시스템의 추가 쿼리가 영향을 받는 행 수와 다소 독립적입니다. 쿼리에서.

또 다른 상황은 업데이트에 따라 달라지는 경우입니다. 작업을 수행해야 하는지 여부에 따라 속성이 변경됩니다. 에서PostgreSQL버전 6.4, 규칙 이벤트에 대한 속성 사양이 비활성화되었습니다( 6.5에서 가장 최근에 컴백했으며 아마도 그 이전 버전일 수도 있습니다. 계속 지켜봐 주시기 바랍니다. 그래서 이제 shoelace_log 예제에서와 같이 규칙을 생성하는 유일한 방법입니다 규칙 자격을 사용하여 수행하는 것입니다. 그 결과 추가 비용이 발생합니다. 관심 있는 속성이 있는 경우에도 항상 수행되는 쿼리 대상에 나타나지 않으므로 전혀 변경할 수 없습니다. 초기 쿼리 목록입니다. 이 기능이 다시 활성화되면 트리거에 비해 규칙이 갖는 또 하나의 장점. 최적화 이 경우 트리거는 정의에 따라 실패해야 합니다. 해당 작업은 특정 속성이 다음과 같은 경우에만 수행됩니다. 업데이트된 기능은 숨겨져 있습니다. 의 정의 트리거는 행 수준에서만 지정할 수 있으므로 행이 터치되면 결정을 내리기 위해 트리거를 호출해야 합니다. 는 규칙 시스템은 대상 목록을 조회하여 이를 인식하고 속성이 그렇지 않은 경우 추가 쿼리를 완전히 억제합니다. 만졌다. 따라서 자격이 있든 없든 규칙은 다음과 같은 경우에만 검색을 수행합니다. 할 일이 있을 수도 있지.

규칙은 다음과 같은 경우에만 트리거보다 상당히 느립니다. 조치로 인해 크고 잘못된 자격을 갖춘 조인, 상황이 발생합니다. 기획자가 실패한 곳. 그들은 큰 망치입니다. 큰 것을 사용하여 주의 없이 망치질을 하면 큰 피해를 입을 수 있습니다. 그러나 오른쪽만 터치하면 머리에 못을 박을 수 있습니다.