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

와이즈 토토 대 트리거

트리거를 사용하여 수행할 수 있는 많은 작업은 다음을 사용하여 구현되었습니다.포스트그레스규칙 시스템. 현재 규칙으로 구현할 수 없는 것은 다음과 같습니다. 제약의 종류. 한정된 규칙을 배치하는 것이 가능합니다. 열의 값이 다음과 같지 않으면 쿼리를 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를 사용하여 인덱스 스캔
다른 가능한 쿼리는 a
호스트 이름 ~ '^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 예에서와 같이 규칙을 생성하는 유일한 방법은 다음과 같습니다. 규칙 자격을 사용하여 수행합니다. 그 결과 추가 쿼리가 발생합니다. 관심 있는 속성이 해당 속성을 사용할 수 없는 경우에도 항상 수행됩니다. 대상 목록에 나타나지 않기 때문에 전혀 변경되지 않습니다. 초기 쿼리. 이 기능을 다시 활성화하면 하나 더 활성화됩니다. 트리거에 비해 규칙의 이점 트리거 최적화는 다음과 같습니다. 이 경우 정의에 따라 실패합니다. 왜냐하면 그것이 행동이라는 사실 때문입니다. 특정 속성이 업데이트된 경우에만 수행됩니다. 그것은 기능성입니다. 트리거의 정의는 다음만 허용합니다. 행 수준에서 지정하므로 행을 터치할 때마다 트리거가 실행됩니다. 결정을 내리기 위해 호출되어야 합니다. 규칙 시스템이 그것을 알 것이다 대상 목록을 조회하여 추가 쿼리를 억제합니다. 속성을 건드리지 않으면 완전히 종료됩니다. 그래서 규칙은 자격을 갖추었습니다 아니면, 뭔가 있을 수 있는 경우에만 스캔을 수행할 것입니다. 할.

규칙은 다음과 같은 경우에만 트리거보다 상당히 느립니다. 조치로 인해 크고 잘못된 자격을 갖춘 조인이 발생하는 상황이 발생합니다. 최적화 프로그램이 실패합니다. 그들은 큰 망치입니다. 큰 망치를 사용하여 주의하지 않으면 큰 피해를 입을 수 있습니다. 하지만 오른쪽과 함께 사용 만지면 머리에 못을 박을 수 있습니다.