views inPostgres사설 토토 시스템을 사용하여 구현되었습니다. 사실 절대적으로 아니오가 있습니다 A의 차이
mytab에서 myview를 선택하십시오 * mytab;두 명령과 비교
테이블 작성 myview (mytab과 같은 동일한 속성 목록); myview to myview 대신 사설 토토 "_retmyview"를 작성하십시오. * mytab에서 * 선택;이것이 바로 Create View 명령이하는 일이기 때문에 내부. 이것은 몇 가지 부작용이 있습니다. 그들 중 하나는 의 견해에 대한 정보Postgres시스템 카탈로그는 정확히 동일합니다 테이블과 마찬가지로. 따라서 쿼리 파서의 경우 절대적으로 있습니다 테이블과 뷰 사이에는 차이가 없습니다. 그들은 같은 것입니다 - 처지. 지금은 중요한 것입니다.
Select의 사설 토토은 마지막 단계로 모든 쿼리에 적용됩니다. 주어진 명령이 삽입, 업데이트 또는 삭제이더라도. 그리고 그것들 그들이 수정한다는 점에서 다른 의미와 다른 의미를 가지고 있습니다. 새 제품을 만드는 대신 자리에있는 Parsetree. 따라서 사설 토토을 선택하십시오 먼저 설명됩니다.
현재, 하나의 행동 만있을 수 있으며 대신 행동을 선택하십시오. 이 제한은 필요했습니다 일반 사용자를 위해 열 수있을 정도로 안전한 사설 토토을 세우십시오. 선택에 대한 사설 토토을 실제보기 사설 토토으로 제한합니다.
이 문서의 예는 일부를 수행하는 두 가지 조인 뷰입니다. 계산 및 더 많은 견해를 차례로 사용합니다. 둘 중 하나 첫 번째보기는 삽입, 업데이트에 대한 사설 토토을 추가하여 나중에 사용자 정의됩니다. 최종 결과가 마법 기능이있는 실제 테이블처럼 행동합니다. 그렇지 않습니다 시작하기에 간단한 예이며 이것은 일을 더 어렵게 만듭니다. 들어가십시오. 그러나 모든 것을 다루는 한 가지 예를 갖는 것이 낫습니다. 많은 다른 것을 갖지 않고 단계별로 논의 된 포인트 명심 할 수있는 것들.
예제에서 재생하는 데 필요한 데이터베이스의 이름은 Al_bundy입니다. 이것이 왜 이것이 데이터베이스 이름인지 곧 알게 될 것입니다. 그리고 그것은 필요합니다 절차 언어 pl/pgsql 설치. 조금 필요하기 때문입니다 최소 () 함수는 2 정수 값의 하위를 반환합니다. 우리는 창조합니다 그 as
기능 최소 (정수, 정수) 생성 정수를 반환합니다 '시작하다 $ 1 <$ 2 인 경우 $ 1의 반환; 끝 IF; $ 2를 반환합니다. 끝;' 언어 'plpgsql';
처음 두 사설 토토 시스템에서 필요한 실제 테이블 설명은 다음과 같습니다.
테이블 SHOE_DATA 만들기 ( Shoename char (10) - 기본 키 SH_AVAIL INTEGER - 사용 가능한 # Slcolor char (10) - 선호 된 떼 색상 Slminlen float, -Miminum Shoelace 길이 Slmaxlen float, - 최대 떼 길이 Slunit char (8) - 길이 단위 ); 테이블 생성 shoelace_data ( SL_Name char (10), - 기본 키 SL_AVAIL INTEGER, - 사용 가능한 # SL_COLOR char (10), - 떼 색상 SL_LEN FLOAT, - 신발성 길이 SL_UNIT char (8) - 길이 단위 ); 테이블 장치 생성 ( un_name char (8) - 기본 키 un_fact float- cm으로 변환하는 요소 );나는 우리 대부분이 신발을 입는다 고 생각하며 이것이 정말 유용한 데이터. 글쎄, 세상에는 신발이 있습니다 신발락이 필요하지 않지만 Al의 삶이 더 쉬워지지는 않으며 그래서 우리는 그것을 무시합니다.
보기는로 생성됩니다.
보기 신발을 만듭니다 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;shoelace보기 (우리가 가진 가장 간단한 것). 관계 떼와 항목을 생성합니다pg_rewrite다시 쓰기 사설 토토이 있음을 알려줍니다 관계 떼가 참조 될 때마다 적용해야합니다. 쿼리에서 rangetable. 사설 토토에는 사설 토토 자격이 없습니다 (현재 선택 사설 토토 이후 비 선택 사설 토토에서 논의 그들을 가질 수 없다) 대신. 사설 토토 자격 쿼리 자격과 동일하지 않습니다! 사설 토토 조치에는 a 자격.
사설 토토 조치는 정확한 사본 인 하나의 querytree입니다. View Creation Command에서 명령문을 선택하십시오.
이제 우리는 포기Unit, Shoe_data및shoelace_data및 Al은 그의 첫 번째 선택을 입력합니다 삶:참고 :신규 및 오래된 두 개의 추가 범위 테이블 항목 (인쇄물의 역사적 이유로 * New * 및 * Current *) querytree) 당신은에서 볼 수 있습니다.pg_rewriteSelect에 대한 입장이 아닙니다 사설 토토.
al_bundy = 단위 값에 삽입 ( 'cm', 1.0); al_bundy = 단위 값에 삽입 ( 'm', 100.0); al_bundy = 단위 값에 삽입 ( '인치', 2.54); al_bundy = al_bundy = Shoe_Data 값에 삽입하십시오 al_bundy- ( 'sh1', 2, 'black', 70.0, 90.0, 'cm'); al_bundy = Shoe_Data 값에 삽입하십시오 al_bundy- ( 'sh2', 0, 'black', 30.0, 40.0, 'inch'); al_bundy = Shoe_Data 값에 삽입하십시오 al_bundy- ( 'sh3', 4, 'brown', 50.0, 65.0, 'cm'); al_bundy = Shoe_Data 값에 삽입하십시오 al_bundy- ( 'sh4', 3, 'brown', 40.0, 50.0, 'inch'); al_bundy = al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl1', 5, 'black', 80.0, 'cm'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl2', 6, 'black', 100.0, 'cm'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl3', 0, 'black', 35.0, 'inch'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl4', 8, 'black', 40.0, 'inch'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl5', 4, 'brown', 1.0, 'm'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl6', 0, 'brown', 0.9, 'm'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl7', 7, 'brown', 60, 'cm'); al_bundy = shoelace_data 값에 삽입하십시오 al_bundy- ( 'sl8', 1, 'brown', 40, 'inch'); al_bundy = al_bundy = select *에서 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 줄)우리의 견해에서 AL이 할 수있는 가장 간단한 선택이므로 우리는 이것은보기 사설 토토의 기본 사항을 설명하기 위해. 'select * from Shoelace '는 파서에 의해 해석되었고 파 세트를 생산했습니다
shoelace.sl_name, shoelace.sl_avail 선택을 선택하십시오. shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm Shoelace Shoelace에서;그리고 이것은 사설 토토 시스템에 제공됩니다. 사설 토토 시스템이 걷는다 Rangetable을 통해 및 사설 토토이 있는지 확인합니다pg_rewrite어떤 관계에도. 처리 할 때 rangetable entry forShoelace(유일한 것 지금까지)) 파트 세트로 규칙 '_retshoelace'를 찾습니다
S.SL_NAME, S.SL_AVAIL, SELECT SELECT s.sl_color, s.sl_len, s.sl_unit, sl_len_cm으로 float8mul (s.sl_len, u.un_fact) Shoelace *Old *, Shoelace *New *, shoelace_data s, 단위 u 여기서 bpchareq (s.sl_unit, u.un_name);파서가 계산을 변경했습니다 적절한 기능에 대한 호출 자격. 그러나 사실 이것은 아무것도 바뀌지 않습니다. 재 작성의 첫 번째 단계는 합병입니다 두 개의 rangetables. 결과 Parsetree가 읽습니다
shoelace.sl_name, shoelace.sl_avail 선택을 선택하십시오. shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm Shoelace Shoelace에서Shoelace *old *, Shoelace *New *, shoelace_data s, Unit U;2 단계에서는 사설 토토 조치에서 자격을 추가합니다. 파 세트 결과
shoelace.sl_name, shoelace.sl_avail 선택을 선택하십시오. shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm Shoelace Shoelace, Shoelace *Old *, Shoelace *New *, Shoelace_data s, 단위 U여기서 bpchareq (s.sl_unit, u.un_name);그리고 3 단계에서는 Parsetree의 모든 변수를 대체합니다. Rangetable 항목을 참조하십시오 (Shoelace현재 처리되고 있습니다 사설 토토 조치에서 해당 대상 목록 표현식. 이것 최종 쿼리 결과
selects.sl_name, s.sl_avail, S.SL_COLOR, S.SL_LEN, s.sl_unit, float8mul (s.sl_len, u.un_fact)sl_len_cm으로 Shoelace Shoelace, Shoelace *Old *, Shoelace *New *, Shoelace_data s, 유닛 U 여기서 bpchareq (s.sl_unit, u.un_name);이것을 다시 실제로 바꾸는SQL진술서 인간 사용자가 읽기를 입력 할 것입니다
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_data s, unit u 여기서 s.sl_unit = u.un_name;첫 번째 규칙이 적용되었습니다. 이 작업이 완료된 동안 Rangetable이 자랐습니다. 따라서 사설 토토 시스템은 계속 확인합니다 범위 테이블 항목. 다음은 2 번 (Shoelace *Old *)입니다. 관계Shoelace사설 토토이 있지만 이것 Rangetable 항목은 Parsetree이므로 무시됩니다. 나머지는 모두 rangetable이므로 항목에는 사설 토토이 없습니다pg_rewrite또는 참조되지 않으면 끝에 도달합니다 rangetable의. 재 작성이 완료되고 위의 것은 최종입니다 최적화에 대한 결과. Optimizer는 추가를 무시합니다 변수에 의해 참조되지 않는 rangetable 항목 Parsetree 및 Planner/Optimizer가 작성한 계획은 다음과 같습니다. Al이 위의 선택 쿼리를 대신 입력 한 것과 정확히 동일합니다. 보기 선택의.
이제 우리는 블루스 형제가 나타나는 문제에 직면 그의 가게에서 새 신발을 사고 싶어, 그리고 블루스로 형제는 같은 신발을 신고 싶어합니다. 그리고 그들은 원합니다 즉시 착용하여 신발이 필요합니다.
Al은 현재 상점에 어떤 신발을 가지고 있는지 알아야합니다. 일치하는 신발 (색상 및 크기) 및 총 번호 정확히 일치하는 쌍의 쌍은 2가 크거나 동일합니다. 우리는 그를 괴롭 힙니다 수행 방법과 그는 데이터베이스를 묻습니다.
al_bundy = select *에서 shoe_ready where total_avail = 2; shoename | sh_avail | sl_name | sl_avail | Total_avail ----------+--------+----------+-------+---------- sh1 | 2 | SL1 | 5 | 2 sh3 | 4 | SL7 | 7 | 4 (2 줄)al은 신발 전문가이며 Sh1 유형의 신발 만 알고 있습니다. 적합합니다 (Shoelace SL7은 갈색이고 갈색이 필요한 신발입니다. 신발은 신발이 아닙니다. Blues Brothers가 입을 수있는 신발).
파서의 출력은 이번에는 파 세트입니다
SHOE_READY.SHOENAME, SHOE_READY.SH_AVAIL, shoe_ready.sl_name, shoe_ready.sl_avail, Shoe_ready.total_avail Shoe_ready Shoe_ready에서 여기서 int4ge (shoe_ready.total_avail, 2);첫 번째 사설 토토은에 대한 것입니다.Shoe_ready관계 및 파트 세트가 발생합니다
selectrsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, min (rsh.sh_avail, rsl.sl_avail) as total_avail에서 슈로 _ready shoe_ready,Shoe_ready *old *, Shoe_ready *new *, 신발 RSH, Shoelace RSL여기서 int4ge (min (rsh.sh_avail, rsl.sl_avail), 2)및 (bpchareq (rsl.sl_color, rsh.slcolor) 및 float8ge (rsl.sl_len_cm, rsh.slminlen_cm) 및 float8le (rsl.sl_len_cm, rsh.slmaxlen_cm) );실제로 자격의 조항은 다음과 같습니다. 유형의 연산자 노드 및 왼쪽 및 오른쪽 표현식. 하지만 그것은 이미 그대로 읽기 쉽게 만들고 더 적용되는 규칙. 그래서 나는 그것들을 그룹화하기 위해 약간의 parantheses에 넣었습니다. 그것들은 추가 된 순서대로 논리적 단위로 관계 규칙을 계속하여신발참조되고 사설 토토. 신청 한 결과
selectSH.SHOENAME, SH.SH_AVAIL, rsl.sl_name, rsl.sl_avail, 민 (SH.SH_AVAIL, rsl.sl_avail) as total_avail, Shoe_ready Shoe_ready, Shoe_ready *Old *, Shoe_ready *New *, Shoe Rsh, Shoelace RSL,신발 *old *, 신발 *New *, Shoe_data Sh, UN UNwhere (int4ge (min (SH.SH_AVAIL, rsl.sl_avail), 2) 및 (bpchareq (rsl.sl_color,SH.SLCOLOR) 및 float8ge (rsl.sl_len_cm,float8mul (sh.slminlen, un.un_fact)) 및 float8le (rsl.sl_len_cm,float8mul (sh.slmaxlen, un.un_fact)) )) )및 BPCHAREQ (SH.SLUNIT, UN.UN_NAME);그리고 마지막으로 우리는 이미 잘 알려진 사설 토토을 적용합니다Shoelace(이번에는 파 세트에서 조금 더 복잡합니다) 그리고 get
sh.shoename, sh.sh_avail, 선택s.sl_name, S.SL_AVAIL, Min (Sh.sh_avail,s.sl_avail) Total_avail로 Shoe_ready Shoe_ready, Shoe_ready *Old *, Shoe_ready *New *, Shoe Rsh, Shoelace RSL, 신발 *old *, 신발 *새 *, 슈 _data sh, Un,shoelace *old *, Shoelace *New *, shoelace_data s, Unit U(int4ge (min (sh.sh_avail,s.sl_avail), 2) 및 (bpchareq (S.SL_COLOR, Sh.slcolor) 및 float8ge (float8mul (s.sl_len, u.un_fact), float8mul (sh.slminlen, un.un_fact))) 및 float8le (float8mul (s.sl_len, u.un_fact), float8mul (sh.slmaxlen, un.un_fact))) )) )) 및 BPCHAREQ (Sh.Slunit, un.un_name) )및 BPCHAREQ (S.SL_UNIT, U.UN_NAME);다시 우리는 그것을 실제로 줄입니다SQL사설 토토의 최종 출력과 동등한 명령문 체계:
SH.SHOENAME, SH.SH_AVAIL, SELECT SELECT SELECT s.sl_name, s.sl_avail, Min (sh.sh_avail, s.sl_avail) Total_avail Shoe_data Sh, Shoelace_data S, Unit U, Unit Un 여기서 min (sh.sh_avail, s.sl_avail) = 2 및 s.sl_color = sh.slcolor 및 s.sl_len * u.un_fact = sh.slminlen * un.un_fact 및 s.sl_len * u.un_fact <= sh.slmaxlen * un.un_fact 및 sh.sl_unit = un.un_name 및 s.sl_unit = u.un_name;사설 토토의 재귀 처리는 하나의 선택을 다시 작성합니다. Parsetree로 전혀보기가없는 경우 입력하십시오.
참고 :현재 재귀 중지는 없습니다 사설 토토 시스템에서보기 규칙을위한 메커니즘 (다른 사람 만 규칙). 이것을 밀어 붙일 수있는 유일한 방법이기 때문에 이것은 크게 아프지 않습니다. 끝없는 루프로 (백엔드가 메모리 제한)는 테이블을 작성한 다음보기 규칙을 설정하는 것입니다. 그러한 방식으로 규칙을 만들고 손으로 하나에서 선택하는 다른 것. 이것은 결코 일어날 수 없습니다 첫 번째 생성보기에서 두 번째는 관계가 존재하지 않으므로 첫 번째보기는 선택할 수 없습니다. 두 번째로부터.
설명에 파수의 두 세부 사항이 닿지 않습니다. 위의보기 사설 토토. 이것들은 CommandType와입니다 결과적으로. 실제로, 사설 토토은 이것들이 필요하지 않습니다 정보.
다른 명령을 선택하고 하나를 선택하십시오. 분명히 그들은 또 다른 것을 가지고 있습니다 CommandType와 이번에는 결과가 향상됩니다 결과가 나가야하는 순수한 항목. 다른 것은 무엇이든 절대적으로 동일합니다. 따라서 속성이있는 두 개의 테이블 T1과 T2가 있습니다 A와 B, 두 문장의 파 세트
t1, t2에서 t2.b를 선택하십시오. 여기서 t1.a = t2.a; T1 Set B = T2.B 업데이트 여기서 T1.A = T2.A;거의 동일합니다.
rangetables에는 테이블 t1 및 T2.
TargetList에는 하나의 변수가 포함되어 있습니다 표 T2에 대한 rangetable 항목의 속성 B.
자격 표현식은 A의 속성을 비교합니다 두 평등 범위.
결과는 두 파수의 두 가지가 비슷하다는 것입니다 실행 계획. 둘 다 두 테이블에 합류합니다. For the T1의 누락 된 열 업데이트는 TargetList에 추가됩니다. Optimizer와 Final Parsetree는로 읽습니다.
업데이트 t1 설정 a = t1.a, b = t2.b 여기서 t1.a = t2.a;따라서 Executor는 가입을 통해 달리기가 정확히 생성됩니다. 동일한 결과 세트 A
t1.a, t2.b에서 t1, t2에서 t1.a = t2.a;를 선택하십시오.그러나 업데이트에는 약간의 문제가 있습니다. 그만큼 집행자는 가입의 결과가 무엇을하는지 신경 쓰지 않습니다. 의미합니다. 결과는 단지 결과 집합을 생성합니다. 그만큼 하나는 선택 명령이고 다른 하나는 업데이트입니다. 집행자의 발신자로 처리됩니다. 발신자는 여전히 알고 있습니다 (Parsetree를보고) 이것이 업데이트라는 것을 알고 있습니다. 이 결과는 표 T1로 들어가야합니다. 그러나 666 줄 중 어느 것입니다 새 행으로 대체되어야합니까? 계획이 실행되었습니다 잠재적으로 알 수없는 순서대로 0에서 666 사이의 행 수.
이 문제를 해결하려면 다른 항목이 추가됩니다. 업데이트 및 삭제 문의 TargetList. 현재 튜플 ID (CTID). 이것은 특별한 기능이있는 시스템 속성입니다. 그것 행의 블록에 블록과 위치를 포함합니다. 앎 테이블, CTID는 1.5GB에서 하나의 특정 행을 찾는 데 사용될 수 있습니다. 단일 데이터 하나를 가져와 수백만 행을 포함하는 크기의 테이블 차단하다. CTID를 TargetList에 추가 한 후 최종 결과는 세트는로 정의 될 수 있습니다.
t1.a, t2.b, t1.ctid에서 t1.a = t2.a;에서 t1.a, t2.b, t1.ctid를 선택하십시오.이제의 또 다른 세부 사항Postgres무대에 들어갑니다. 지금은 테이블 행을 덮어 쓰지 않으므로 이것이 중단 된 거래입니다. 빠른. 업데이트에서 새 결과 행이 테이블에 삽입됩니다. (CTID 스트리핑 후) 및 그 행의 튜플 헤더에서 CTID CMAX를 가리키고 Xmax 항목이 현재 명령으로 설정됩니다. 카운터 및 현재 트랜잭션 ID. 따라서 오래된 행은 숨겨져 있습니다 거래가 헌신 한 후 진공 청소기는 실제로 움직일 수 있습니다. it.
모든 것을 알고, 우리는 단순히 절대적으로보기 사설 토토을 적용 할 수 있습니다. 어떤 명령과 같은 방식. 차이가 없습니다.
상기는 사설 토토 시스템이보기를 통합하는 방법을 보여줍니다 원래 파 세트로 정의. 두 번째 예에서 a One View에서 Simple Select는 최종 파 세트를 생성했습니다. 4 개의 테이블 조인 (단위는 다른 이름으로 두 번 사용).
사설 토토 시스템으로보기를 구현하는 이점은 Optimizer에는 어떤 테이블이 필요한지에 대한 모든 정보가 있습니다. 스캔 한 플러스이 테이블과 뷰의 제한적인 자격과 자격 하나의 단일 파 세트로 원래 쿼리에서. 그리고 이것은 여전히입니다 원래 쿼리가 이미 뷰를 통해 가입 한 상황. 이제 Optimizer는 실행하기 가장 좋은 경로를 결정해야합니다. 쿼리. 최적화에 대한 정보가 많을수록 더 좋습니다 결정이 될 수 있습니다. 그리고 구현 된 사설 토토 시스템Postgres이것이 모든 정보인지 확인합니다 지금까지 쿼리에 대해 사용할 수 있습니다.
오랜 시간이 있었는데Postgres사설 토토 시스템은 깨진 것으로 간주되었습니다. 사설 토토 사용은 권장되지 않았으며 유일한 부분은 보기 사설 토토. 또한 이러한 견해 사설 토토은 문제가 발생했습니다 사설 토토 시스템은 다른 사람에게 제대로 적용 할 수 없었습니다. SELECT (예 : 데이터를 사용한 업데이트) 보기가 작동하지 않았습니다).
그 기간 동안 개발이 시작되었고 많은 기능 파서 및 최적화기에 추가되었습니다. 사설 토토 시스템이 더 많이 얻었습니다 더 많은 기능과 동기화되지 않고 더 어려워졌고 그것을 고치기가 더 어렵습니다. 따라서 아무도 없었습니다.
6.4의 경우 누군가 문을 잠그고 심호흡을했고 그 저주받은 물건을 뒤섞었다. 나온 것은 사설 토토 시스템이었습니다 이 문서에 설명 된 기능. 그러나 여전히 있습니다 일부 구조물은 처리되지 않고 사물로 인해 실패하는 곳 현재 지원되지 않습니다.Postgres쿼리 최적화기.
집계 열이있는 뷰에는 나쁜 문제가 있습니다. 골재 자격 표현은 하위 선택에 사용되어야합니다. 현재 두 개의 조회수에 참여할 수 없습니다. 골재 열이 있고 두 집계를 비교하십시오 자격의 가치. 그 동안 가능합니다 이러한 집계 표현식을 기능에 넣습니다 적절한 인수와보기 정의에서 그것들을 사용하십시오.
노조의 전망은 현재 지원되지 않습니다. 쉽습니다 간단한 선택을 연합에 다시 작성합니다. 그러나 그것은 조금입니다 보기가 업데이트를 수행하는 가입의 일부라면 어렵습니다.
보기 정의에서 조항에 의한 주문은 지원되지 않습니다.
view view 정의에서는 별개가 지원되지 않습니다.
Optimizer가 처리하지 말아야 할 이유는 없습니다. Parsetree Constructs는 Parser가 의 한계SQL구문. 그만큼 저자는이 항목들이 미래에 사라지기를 희망합니다.
뷰를 구현하기 위해 설명 된 사설 토토 시스템을 사용하면 재미가 있습니다. 부작용. 다음은 작동하지 않는 것 같습니다.
al_bundy = 신발에 삽입 (shoename, sh_avail, slcolor) al_bundy- value ( 'sh5', 0, 'black'); 20128 삽입 1 al_bundy = shoe_data에서 shoename, sh_avail, slcolor를 선택하십시오. Shoename | sh_avail | slcolor ----------+--------+---------- sh1 | 2 | 검은 색 sh3 | 4 | 브라운 sh2 | 0 | 블랙 sh4 | 3 | 브라운 (4 줄)흥미로운 점은 삽입에 대한 리턴 코드가 주어진다는 것입니다. 우리는 객체 ID이며 1 행이 삽입되었다고 말했습니다. 그러나 그것은 에 나타나지 않습니다.Shoe_data. 조사 우리가 볼 수있는 데이터베이스 디렉토리, 데이터베이스 파일 관계보기신발이제 a 데이터 블록. 그리고 그것은 확실히 사실입니다.
우리는 또한 삭제를 발행 할 수 있으며 자격, 그것은 우리에게 행이 삭제되었고 다음에 진공 실행은 파일을 0 크기로 재설정합니다.
그 행동의 이유는 삽입은를 참조하지 않습니다.신발변수의 관계. TargetList에는 상수 만 포함됩니다 값. 따라서 신청할 사설 토토이 없으며 변경되지 않습니다. 실행 및 행이 삽입됩니다. 그리고 삭제를 위해.
이를 변경하려면 동작을 수정하는 규칙을 정의 할 수 있습니다. 비 선택 쿼리. 이것은 다음 섹션의 주제입니다.