이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다스포츠 토토 결과3_스포츠 토토 결과SL1검은 색버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

33.2. 보기 및 토토 핫 시스템

views inPostgreSQL토토 핫 시스템을 사용하여 구현되었습니다. 사실, 본질적으로 있습니다 사이의 차이 없음

mytab에서 myview를 선택하십시오 * mytab;

두 명령과 비교

테이블 작성 myview (mytab과 같은 열 목록);
myview to myview 대신 토토 핫 "_return"을 작성하십시오.
    * mytab에서 * 선택;

이것이 바로이기 때문에생성 보다명령은 내부적으로 수행됩니다. 이것은 몇 가지 부작용이 있습니다. 그들 중 하나는의 견해에 대한 정보입니다.PostgreSQL시스템 카탈로그입니다 테이블과 정확히 동일합니다. 그래서 파서에게 테이블과 뷰 사이에는 전혀 차이가 없습니다. 그들은입니다 같은 것 : 관계.

33.2.1. 어떻게select토토 핫 작업

토토 핫ON SELECT모두에게 적용됩니다 주어진 명령이 a이더라도 마지막 단계로 쿼리삽입, 업데이트또는삭제. 그리고 그들은 다른 명령에 대한 토토 핫과 다른 의미를 가지고 있습니다. 유형의 쿼리 트리를 대신 제자리에 수정합니다. 새로운 것을 만들었습니다. 그래서select토토 핫 먼저 설명됩니다.

현재, AN에는 한 가지 행동 만있을 수 있습니다.ON SELECT토토 핫, 무조건적이어야합니다select행동대신. 이 제한은 만들어야했습니다 일반 사용자를 위해 열 수있을만큼 안전한 토토 핫 제한ON SELECT보기.

이 장의 예제는 두 가지 조인보기입니다. 일부 계산 및이를 사용하는 더 많은 견해. 하나 두 개의 첫 번째보기 중에 대한 토토 핫을 추가하여 나중에 사용자 정의됩니다.삽입, 업데이트삭제최종 결과가 동작하는 관점이되도록 조작 마법 기능이있는 실제 테이블처럼. 이것은 아닙니다 시작하기에 간단한 예제이며 이것은 일을 만듭니다. 들어가기가 더 어렵습니다. 그러나 한 가지 예를 갖는 것이 좋습니다 covers all the points discussed step by step rather than havi토토 핫 명심 할 수있는 많은 다른 것들.

예를 들어, 우리는 약간 필요합니다Min2 정수의 하단을 반환하는 함수 값. 우리는 그것을로 만듭니다.

함수 Min (정수, 정수) 생성 정수를 $$로 반환합니다
    $ 1 <$ 2 그런 다음 $ 1 one $ 2 종료 인 경우 사례를 선택하십시오.
$$ Language SQL Strict;

처음 두 토토 핫 시스템에서 필요한 실제 테이블 설명은 다음과 같습니다.

테이블 SHOE_DATA 만들기 (
    Shoename 텍스트 - 기본 키
    SH_AVAIL INTEGER - 사용 가능한 쌍
    Slcolor Text - 선호하는 떼 색상
    Slminlen Real, - 최소 신발 끈 길이
    Slmaxlen Real, - 최대 떼 길이
    슬루 니트 텍스트 - 길이 단위
);

테이블 생성 shoelace_data (
    SL_NAME 텍스트 - 기본 키
    SL_AVAIL INTEGER - 사용 가능한 수의 쌍
    SL_COLOR 텍스트 - 신발색
    SL_LEN Real, - 신발성 길이
    SL_UNIT 텍스트 - 길이 단위
);

테이블 장치 생성 (
    UN_NAME 텍스트 - 기본 키
    UN_FACT Real- CM으로 변환하는 요소
);

보시다시피, 신발 매장 데이터를 나타냅니다.

보기는로 생성됩니다.

보기 신발을 만듭니다
    sh.shoename 선택,
           sh.sh_avail,
           Sh.slcolor,
           Sh.slminlen,
           sh.slminlen * un.un_fact as slminlen_cm,
           sh.slmaxlen,
           sh.slmaxlen * slmaxlen_cm as as slmaxlen * un.un_fact,
           Sh.slunit
      Shoe_data Sh, Un
     여기서 sh.slunit = un.un_name;

Shoelace보기를 만듭니다
    s.sl_name 선택,
           s.sl_avail,
           s.sl_color,
           s.sl_len,
           s.sl_unit,
           s.sl_len * u.un_fact as sl_len_cm
      shoelace_data s, unit u
     여기서 s.sl_unit = u.un_name;

Shoe_ready를 View를 만듭니다
    rsh.shoename 선택,
           rsh.sh_avail,
           rsl.sl_name,
           rsl.sl_avail,
           Min (rsh.sh_avail, rsl.sl_avail)은 Total_avail입니다
      Shoe Rsh, Shoelace RSL에서
     여기서 rsl.sl_color = rsh.slcolor
       및 rsl.sl_len_cm = rsh.slminlen_cm
       및 rsl.sl_len_cm <= rsh.slmaxlen_cm;

the보기 만들기Shoelace보기 (가장 간단한 것입니다 우리가 가진 하나)는 관계를 만들 것입니다Shoelace및 입력pg_rewrite재 작성이 있음을 알려줍니다 관계가있을 때마다 적용 해야하는 토토 핫Shoelace는 쿼리의 범위 테이블에 참조됩니다. 토토 핫에는 토토 핫 자격이 없습니다 (나중에 논의, 비select토토 핫, 이후select현재 토토 핫을 가질 수 없습니다) 이다대신. 그 토토 핫에 유의하십시오 자격은 쿼리 자격과 동일하지 않습니다. 그만큼 우리의 토토 핫의 조치에는 쿼리 자격이 있습니다. 의 행동 토토 핫은 사본 인 하나의 쿼리 트리입니다.selectView Creation의 진술 명령.

참고 :두 개의 추가 범위 테이블 항목NEWandold(이름*New*and*old*역사적 이유 인쇄 된 쿼리 트리에서)에서 볼 수 있습니다.pg_rewrite입장에 관심이 없습니다select토토 핫.

이제 우리는 포기Unit, Shoe_dataandshoelace_dataa에서 간단한 쿼리를 실행하십시오 보다:

단위 값 ( 'cm', 1.0)에 삽입;
단위 값에 삽입 ( 'm', 100.0);
단위 값에 삽입 ( '인치', 2.54);

Shoe_Data 값 ( 'SH1', 2, 'Black', 70.0, 90.0, 'cm')에 삽입;
Shoe_data 값에 삽입 ( 'sh2', 0, 'black', 30.0, 40.0, 'inch');
Shoe_data 값에 삽입 ( 'sh3', 4, 'brown', 50.0, 65.0, 'cm');
Shoe_data 값에 삽입 ( 'sh4', 3, 'brown', 40.0, 50.0, 'inch');

shoelace_data 값에 삽입 ( 'sl1', 5, 'black', 80.0, 'cm');
shoelace_data 값에 삽입 ( 'sl2', 6, 'black', 100.0, 'cm');
shoelace_data 값에 삽입 ( 'sl3', 0, 'black', 35.0, 'inch');
shoelace_data 값에 삽입 ( 'sl4', 8, 'black', 40.0, 'inch');
shoelace_data 값 ( 'sl5', 4, 'brown', 1.0, 'm')에 삽입;
shoelace_data 값 ( 'sl6', 0, 'brown', 0.9, 'm')에 삽입;
shoelace_data 값에 삽입 ( 'sl7', 7, 'brown', 60, 'cm');
shoelace_data 값에 삽입 ( 'sl8', 1, 'brown', 40, 'inch');

Shoelace에서 *를 선택하십시오.

 sl_name | SL_AVAIL | SL_COLOR | SL_LEN | SL_UNIT | SL_LEN_CM
-----------+----------+----------+-------+-------------------------------------------------------------
 SL1 |        5 | 검은 색 |     80 | cm |        80
 SL2 |        6 | 검은 색 |    100 | cm |       100
 SL7 |        7 | 브라운 |     60 | cm |        60
 SL3 |        0 | 검은 색 |     35 | 인치 |      88.9
 SL4 |        8 | 검은 색 |     40 | 인치 |     101.6
 SL8 |        1 | 브라운 |     40 | 인치 |     101.6
 SL5 |        4 | 브라운 |      1 | m |       100
 SL6 |        0 | 브라운 |    0.9 | m |        90
(8 줄)

이것은 가장 간단합니다select할 수 있습니다 우리의 견해에 대해, 우리는이 기회를 통해 보기 토토 핫의 기본 사항. 그만큼선택 *에서 구두끈는 파서에 의해 해석되어 생산되었습니다 쿼리 트리

shoelace.sl_name, shoelace.sl_avail 선택을 선택하십시오.
       shoelace.sl_color, shoelace.sl_len,
       shoelace.sl_unit, shoelace.sl_len_cm
  Shoelace Shoelace에서;

그리고 이것은 토토 핫 시스템에 제공됩니다. 토토 핫 시스템이 걷는다 범위 테이블을 통해 및 토토 핫이 있는지 확인합니다. 관계. 범위 테이블 항목을 처리 할 때Shoelace(지금까지 유일한 사람)는를 찾습니다._return쿼리 트리를 사용한 토토 핫

S.SL_NAME, S.SL_AVAIL, SELECT SELECT
       s.sl_color, s.sl_len, s.sl_unit,
       s.sl_len * u.un_fact as sl_len_cm
  Shoelace *Old *, Shoelace *New *,
       shoelace_data s, 단위 u
 여기서 s.sl_unit = u.un_name;

보기를 확장하려면 다시 작성자는 단순히 하위 쿼리를 만듭니다. 토토 핫의 조치 쿼리 트리를 포함하는 범위 테이블 항목 및 이 범위 테이블 항목을 원래 테이블 항목으로 대체합니다. 견해를 참조했습니다. 결과적으로 다시 작성된 쿼리 트리는 다음과 같습니다 입력 한 것과 거의 똑같

shoelace.sl_name, shoelace.sl_avail 선택을 선택하십시오.
       shoelace.sl_color, shoelace.sl_len,
       shoelace.sl_unit, shoelace.sl_len_cm
  From (select s.sl_name,
               s.sl_avail,
               s.sl_color,
               s.sl_len,
               s.sl_unit,
               s.sl_len * u.un_fact as sl_len_cm
          shoelace_data s, unit u
         여기서 s.sl_unit = u.un_name) shoelace;

그러나 한 가지 차이점이 있습니다 : 하위 쿼리의 범위 테이블 두 개의 추가 항목이 있습니다Shoelace *Old *andShoelace *New *. 이 항목 쿼리에 직접 참여하지 않으므로 그렇지 않습니다 하위 쿼리의 조인 트리 또는 대상 목록에 의해 참조됩니다. 그만큼 Rewriter는 그것들을 사용하여 액세스 권한 검사를 저장합니다 원래 범위 테이블에있는 정보 보기를 참조하는 항목. 이런 식으로 집행자는 할 것입니다 여전히 사용자가 액세스 할 수있는 적절한 권한이 있는지 확인하십시오. 보기,보기에 직접 사용되지 않더라도 다시 작성 쿼리.

그것은 첫 번째 토토 핫이 적용되었습니다. 토토 핫 시스템이 있습니다 상단에 나머지 범위 테이블 항목을 계속 확인하십시오 쿼리 (이 예에서는 더 이상 없음). 추가 된 하위 쿼리의 범위 테이블 항목을 재귀 적으로 확인하십시오 참조 뷰가 있는지 확인합니다. (그러나 그것은 확장되지 않을 것입니다*old*또는*New*- 그렇지 않으면 우리는 무한 재귀가있을 것입니다!) 이 예에서는에 대한 재 작성 토토 핫이 없습니다.Shoelace_data또는Unit, 따라서 다시 쓰기가 완료되고 위는 최종 결과입니다. 플래너에게 주어진.

아니요 우리는 어떤 신발을 찾는 쿼리를 쓰고 싶습니다 현재 상점에 우리는 일치하는 신발 끈을 가지고 있습니다 (컬러 그리고 길이) 및 정확히 일치하는 총 수 쌍은 두 개 또는 동일합니다.

SELECT *에서 SHOE_READY where total_avail = 2;

 떼 이름 | sh_avail | sl_name | SL_AVAIL | Total_avail
----------+----------+---------+-------------------
 sh1 |        2 | SL1 |        5 |           2
 sh3 |        4 | SL7 |        7 |           4
(2 줄)

파서의 출력은 이번에는 쿼리 트리입니다

SHOE_READY.SHOENAME, SHOE_READY.SH_AVAIL,
       shoe_ready.sl_name, shoe_ready.sl_avail,
       Shoe_ready.total_avail
  Shoe_ready Shoe_ready에서
 여기서 shoe_ready.total_avail = 2;

첫 번째 토토 핫은에 대한 첫 번째 토토 핫입니다.Shoe_ready보기를보고 쿼리가 발생합니다 나무

SHOE_READY.SHOENAME, SHOE_READY.SH_AVAIL,
       shoe_ready.sl_name, shoe_ready.sl_avail,
       Shoe_ready.total_avail
  From (select rsh.shoename,
               rsh.sh_avail,
               rsl.sl_name,
               rsl.sl_avail,
               Min (rsh.sh_avail, rsl.sl_avail)은 Total_avail입니다
          Shoe Rsh, Shoelace RSL에서
         여기서 rsl.sl_color = rsh.slcolor
           및 rsl.sl_len_cm = rsh.slminlen_cm
           및 rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
 여기서 shoe_ready.total_avail = 2;

마찬가지로에 대한 토토 핫신발andShoelace하위 쿼리의 범위 테이블, 3 단계 결승전으로 이어집니다. 쿼리 트리 :

SHOE_READY.SHOENAME, SHOE_READY.SH_AVAIL,
       shoe_ready.sl_name, shoe_ready.sl_avail,
       Shoe_ready.total_avail
  From (select rsh.shoename,
               rsh.sh_avail,
               rsl.sl_name,
               rsl.sl_avail,
               Min (rsh.sh_avail, rsl.sl_avail)은 Total_avail입니다
          에서 (select sh.shoename,
                       sh.sh_avail,
                       Sh.slcolor,
                       Sh.slminlen,
                       sh.slminlen * un.un_fact as slminlen_cm,
                       sh.slmaxlen,
                       sh.slmaxlen * slmaxlen_cm as as slmaxlen * un.un_fact,
                       Sh.slunit
                  Shoe_data Sh, Un
                 여기서 sh.slunit = un.un_name) rsh,
               (S.SL_NAME 선택,
                       s.sl_avail,
                       s.sl_color,
                       s.sl_len,
                       s.sl_unit,
                       s.sl_len * u.un_fact as sl_len_cm
                  shoelace_data s, unit u
                 여기서 s.sl_unit = u.un_name) rsl
         여기서 rsl.sl_color = rsh.slcolor
           및 rsl.sl_len_cm = rsh.slminlen_cm
           및 rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
 여기서 shoe_ready.total_avail 2;

플래너 가이 나무를 2 레벨 쿼리 트리 : 병적select명령은입니다."풀링"중간으로select처리 할 필요가 없기 때문에 갈라져. 하지만 중간select의지 집계가 포함되어 있기 때문에 상단과 분리되어 있습니다 기능. 우리가 그것들을 끌어 올리면 그것은 행동을 바꿀 것입니다 최상위select, 우리는 그렇지 않습니다 원하다. 그러나 쿼리 트리를 무너 뜨리는 것은 최적화입니다 다시 쓰기 시스템이 스스로 관심을 가질 필요가 없습니다 와 함께.

참고 :현재 재귀 중지는 없습니다 토토 핫 시스템에서보기 토토 핫을위한 메커니즘 ( 다른 종류의 토토 핫). 이것은 크게 아프지 않습니다 이것을 끝없는 루프로 밀어 넣는 유일한 방법 ( 서버 프로세스가 메모리 제한에 도달 할 때까지) 테이블을 작성한 다음로 뷰 토토 핫을 직접 설정하십시오.토토 핫 만들기그런 식으로 하나는 하나에서 선택하는 다른 하나를 선택합니다. 이것 이면 절대 일어날 수 없습니다.보기 만들기첫 번째로 사용되기 때문에생성 보다, 두 번째 관계는 존재하지 않으므로 첫 번째보기는 두 번째보기에서 선택할 수 없습니다.

33.2.2. 보다 비의 토토 핫select진술

쿼리 트리의 두 세부 사항은 위의보기 토토 핫에 대한 설명. 이것들은 명령 유형입니다 결과 관계. 실제로, 토토 핫은 이것을 필요로하지 않습니다 정보.

쿼리 트리 사이에는 몇 가지 차이가 ​​있습니다select그리고 다른 명령에 대한 하나. 분명히, 그들은 다른 명령 유형을 가지고 있으며 명령을 A 이외select, 결과 관계는 결과가있는 범위 테이블 항목을 가리 킵니다 가야합니다. 다른 모든 것은 절대적으로 동일합니다. 그래서 두 테이블T1andT2열이있는aandB, 두 사람의 쿼리 트리 진술

t1, t2에서 t2.b를 선택하십시오. 여기서 t1.a = t2.a;

T1 Set B = T2.B 업데이트 여기서 T1.A = T2.A;

거의 동일합니다. 특히:

  • 범위 테이블에는 테이블의 항목이 포함되어 있습니다T1andT2.

  • 대상 목록에는 하나의 변수가 포함됩니다 열B범위 테이블 항목의 테이블 용T2.

  • 자격 표현식은 열을 비교합니다a평등.

  • 가입 트리는 간단한 결합을 보여줍니다T1andT2.

결과는 두 쿼리 트리가 비슷한 결과를 초래한다는 것입니다. 실행 계획 : 둘 다 두 테이블에 합류합니다. 을 위한 그만큼업데이트누락 된 열에서T1플래너와 최종 쿼리 트리는로 읽습니다.

업데이트 t1 설정 a = t1.a, b = t2.b 여기서 t1.a = t2.a;

따라서 Executor가 Join을 통해 달리는 것은 정확히 생성됩니다. 동일한 결과 세트 A

t1.a, t2.b에서 t1.a = t2.a;를 선택하십시오.

하지만 약간의 문제가 있습니다업데이트: 집행자는 무엇을 신경 쓰지 않습니다 그들이하는 가입의 결과는 그냥 결과 집합을 생성합니다. 하나가 A이라는 차이select명령이고 다른 하나는업데이트의 발신자에서 처리됩니다 집행자. 발신자는 여전히 알고 있습니다 (쿼리 트리를보고) 이건업데이트이 결과는 표로 들어가야한다T1. 그러나 거기에있는 행 중 어느 줄이 새 행으로 대체 되나요?

이 문제를 해결하려면 다른 항목이 추가됩니다. 대상 목록업데이트(및 in삭제) 문 : 현재 튜플 ID (CTID).파일이 포함 된 시스템 열입니다 행 블록의 블록 번호와 위치. 알고있는 테이블,CTID를 사용할 수 있습니다 원래 행을 검색하려면T1to 업데이트됩니다. 추가 후CTID대상 목록에 실제로 쿼리 같아요

t1.a, t2.b, t1.ctid에서 t1, t2에서 t1.a = t2.a;를 선택하십시오.

이제 또 다른 세부 사항PostgreSQL무대에 들어갑니다. 오래된 테이블 줄은 덮어 쓰지 않았으며 이것이 이유입니다롤백빠릅니다. 에서업데이트, 새 결과 행이 테이블 (스트리핑 후CTID) 그리고 오래된 행의 행 헤드러,CTID그만큼cmaxandxmax항목은 현재 명령으로 설정됩니다 카운터 및 현재 트랜잭션 ID. 따라서 오래된 줄은 숨겨져 있습니다. 거래 후 진공 청소기 캔이 커지고 있습니다 정말로 옮기세요.

모든 것을 알고, 우리는 단순히보기 토토 핫을 적용 할 수 있습니다. 어떤 명령과 같은 방식으로. 아니요 차이점.

33.2.3. 그만큼 의 견해의 힘PostgreSQL

상기는 토토 핫 시스템이보기를 통합하는 방법을 보여줍니다 원래 쿼리 트리에 대한 정의. 두 번째 예, 간단한select한보기에서 4 개의 테이블에 가입 한 최종 쿼리 트리를 만들었습니다. (Unit다른 두 번 사용되었습니다 이름).

토토 핫 시스템으로보기를 구현하는 이점은, 플래너가 어떤 테이블에 대한 모든 정보를 가지고 있음 스캔해야 하고이 테이블 간의 관계를 스캔해야합니다. 또한 Views Plus의 제한적인 자격 하나의 단일 쿼리의 원래 쿼리의 자격 나무. 그리고 이것은 여전히 ​​원래 쿼리가 이미 조회수에 대한 가입입니다. 플래너는 어느 것을 결정해야합니다 쿼리 실행을위한 가장 좋은 경로이며 더 많은 정보입니다. 플래너는이 결정이 더 좋을 수 있습니다. 그리고 토토 핫 에서 구현 된 시스템PostgreSQL이것이 전부인지 확인합니다 그 시점까지 쿼리에 대한 정보.

33.2.4. 보기 업데이트

보기가 대상 관계로 지명되면 어떻게되는지삽입, 업데이트또는삭제? 위에서 설명한 대체를 수행 한 후에는 결과 관계가 하위 쿼리에 가리키는 쿼리 트리 범위 테이블 항목. 이것은 작동하지 않으므로 다시 작성자가 던졌습니다 그것이 그런 것을 생성 한 것을 보면 오류.

이를 변경하려면 동작을 수정하는 토토 핫을 정의 할 수 있습니다. 이런 종류의 명령 중. 이것이 다음 주제입니다 부분.