PostgreSQL 9.2.24 Tài liệu | ||||
---|---|---|---|---|
Prev | UP | Chương 37. Hệ thống kèo bóng đá pháp | Tiếp theo |
chế độ kèo bóng đá pháp trongPostgreSQLlà được thực hiện bằng cách sử dụng hệ thống kèo bóng đá pháp. Trên thực tế, về cơ bản có Không có sự khác biệt giữa:
Tạo kèo bóng đá pháp myView là chọn * từ mytab;
so với hai lệnh:
Tạo bảng MyView (cùng danh sách cột với MyTab); Tạo kèo bóng đá pháp "_return" như trên chọn vào myView do thay thế Chọn * từ mytab;
Bởi vì đây chính xác là những gìTạo kèo bóng đá phápLệnh làm nội bộ. Điều này có một số tác dụng phụ. Một trong số đó là thông tin về chế độ kèo bóng đá pháp trongPostgreSQLDanh mục hệ kèo bóng đá pháp là Chính xác giống như nó cho một bảng. Vì vậy, đối với trình phân tích cú pháp, ở đó hoàn toàn không có sự khác biệt giữa một bảng và một cái nhìn. Họ là Điều tương tự: quan hệ.
kèo bóng đá pháptrên Chọnđược áp dụng cho tất cả Truy vấn là bước cuối cùng, ngay cả khi lệnh được đưa ra làChèn, Cập nhậthoặcXóa. Và Họ có các ngữ nghĩa khác nhau từ các kèo bóng đá pháp trên lệnh khác Các loại trong đó họ sửa đổi cây truy vấn tại chỗ thay vì Tạo một cái mới. Vì thếChọnkèo bóng đá pháp được mô tả đầu tiên.
Hiện tại, chỉ có thể có một hành động trong mộtON CHỌNkèo bóng đá pháp và nó phải là một điều vô điều kiệnChọnhành động đó làThay kèo bóng đá phápo đó. Hạn chế này được yêu cầu để thực hiện Các kèo bóng đá pháp đủ an toàn để mở chúng cho người dùng thông thường và nó Hạn chếON CHỌNkèo bóng đá pháp hành động như chế độ xem.
Ví dụ cho chương này là hai lượt xem tham gia Một số tính toán và một số quan điểm khác sử dụng chúng lần lượt. Một của hai chế độ xem đầu tiên được tùy chỉnh sau bằng cách thêm kèo bóng đá pháp choChèn, Cập nhật13122_13130XóaHoạt động để kết quả cuối cùng sẽ là một quan điểm hoạt động Giống như một bảng thực sự với một số chức năng ma thuật. Đây không phải là Một ví dụ đơn giản như vậy để bắt đầu và điều này làm cho mọi thứ Khó hơn để kèo bóng đá phápo. Nhưng tốt hơn là có một ví dụ bao gồm tất cả các điểm được thảo luận từng bước thay vì có nhiều cái khác nhau có thể trộn lẫn trong tâm trí.
Ví dụ, chúng ta cần một chútminHàm trả về thấp hơn của 2 Số nguyên giá trị. Chúng tôi tạo ra nó như:
Tạo hàm tối thiểu (số nguyên, số nguyên) trả về số nguyên dưới dạng $$ Chọn trường hợp khi $ 1 <$ 2 sau đó $ 1 khác $ 2 kết thúc $$ ngôn ngữ sql nghiêm ngặt;
Các bảng thực sự chúng ta cần trong hai hệ thống kèo bóng đá pháp đầu tiên Mô tả là:
14000_14759
Như bạn có thể thấy, chúng đại diện cho dữ liệu cửa hàng giày.
Các chế độ kèo bóng đá pháp được tạo là:
Tạo giày kèo bóng đá pháp AS Chọn Sh.Shoename, sh.sh_avail, sh.slcolor, sh.slminlen, sh.slminlen * un.un_fact dưới dạng slminlen_cm, sh.slmaxlen, sh.slmaxlen * un.un_fact dưới dạng slmaxlen_cm, Sh.Slunit Từ giày_data sh, unit un Trong đó sh.slunit = un.un_name; Tạo Chế độ kèo bóng đá pháp Shoelace như Chọn 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 Từ shoelace_data s, đơn vị u Trong đó s.sl_unit = u.un_name; Tạo kèo bóng đá pháp giày_ready AS Chọn rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, tối thiểu (rsh.sh_avail, rsl.sl_avail) dưới dạng TOTAL_AVAIL Từ RSH giày, dây giày RSL WHERE RSL.SL_COLOR = RSH.SLCOLOR Và rsl.sl_len_cm = rsh.slminlen_cm Và rsl.sl_len_cm <= rsh.slmaxlen_cm;
TheTạo chế độ kèo bóng đá pháplệnh choShoelacekèo bóng đá pháp (đây là đơn giản nhất một chúng ta có) sẽ tạo ra một mối quan hệShoelacevà một mục nhập trongPG_REWRITEĐiều đó cho biết rằng có một bản viết lại kèo bóng đá pháp phải được áp dụng bất cứ khi nào quan hệShoelaceđược tham chiếu trong bảng phạm vi của một truy vấn. kèo bóng đá pháp không có trình độ kèo bóng đá pháp (thảo luận sau, với khôngChọnkèo bóng đá pháp, kể từChọnkèo bóng đá pháp hiện không có chúng) và nó làThay kèo bóng đá phápo đó. Lưu ý rằng kèo bóng đá pháp đó Trình độ chuyên môn không giống như trình độ truy vấn. Các Hành động của kèo bóng đá pháp của chúng tôi có trình độ truy vấn. Hành động của kèo bóng đá pháp là một cây truy vấn là bản sao củaChọnTuyên bố trong Tạo quan điểm yêu cầu.
Lưu ý:Hai mục bảng phạm vi bổ sung chonewvàcũmà bạn có thể thấy trongPG_REWRITEmục nhập không quan tâm choChọnkèo bóng đá pháp.
Bây giờ chúng tôi dân cưĐơn vị, giày_datavàShoelace_data17313_17353
17388_18993
Đây là đơn giản nhấtChọnBạn có thể làm theo quan điểm của chúng tôi, vì vậy chúng tôi nhân cơ hội này để giải thích Khái niệm cơ bản của các kèo bóng đá pháp xem. TheChọn * Từ Shoelaceđã được trình phân tích cú kèo bóng đá pháp giải thích và sản xuất Cây truy vấn:
Chọn Shoelace.SL_NAME, SHOELACE.SL_AVAIL, Shoelace.SL_Color, Shoelace.SL_LEN, Shoelace.SL_Unit, Shoelace.SL_LEN_CM Từ dây giày Shoelace;
Và điều này được đưa ra cho hệ thống kèo bóng đá pháp. Hệ thống kèo bóng đá pháp đi bộ thông qua bảng phạm vi và kiểm tra xem có kèo bóng đá pháp cho bất kỳ mối quan hệ. Khi xử lý mục nhập bảng phạm vi choShoelace(người duy nhất cho đến bây giờ) nó tìm thấy_returnkèo bóng đá pháp với cây truy vấn:
Chọn 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 Từ Shoelace cũ, Shoelace Mới, shoelace_data s, đơn vị u Trong đó s.sl_unit = U.un_name;
Để mở rộng chế độ xem, người viết lại chỉ cần tạo một truy vấn con Mục nhập bảng phạm vi chứa cây truy vấn hành động của kèo bóng đá pháp và thay thế mục nhập bảng phạm vi này cho cái ban đầu tham chiếu quan điểm. Cây truy vấn viết lại kết quả là gần như giống như khi bạn đã gõ:
Chọn Shoelace.SL_NAME, SHOELACE.SL_AVAIL, Shoelace.SL_Color, Shoelace.SL_LEN, Shoelace.SL_Unit, Shoelace.SL_LEN_CM Từ (chọn 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 Từ shoelace_data s, đơn vị u Trong đó s.sl_unit = U.un_name) Shoelace;
Tuy nhiên có hai mục bổ sungShoelace OldvàShoelace mới. Những mục này không tham gia trực tiếp vào truy vấn, vì chúng không được tham chiếu bởi cây tham gia hoặc danh sách mục tiêu của Subquery. Các công cụ viết lại sử dụng họ để lưu trữ thông tin kiểm tra đặc kèo bóng đá phápền truy cập ban đầu có mặt trong mục nhập bảng phạm vi tham chiếu xem. Theo cách này, người thực thi vẫn sẽ kiểm tra xem người dùng có có các đặc kèo bóng đá phápền thích hợp để truy cập chế độ xem, mặc dù có Không sử dụng trực tiếp chế độ xem trong truy vấn viết lại.
Đó là kèo bóng đá pháp đầu tiên được áp dụng. Hệ thống kèo bóng đá pháp sẽ Tiếp tục kiểm tra các mục bảng phạm vi còn lại ở trên cùng truy vấn (trong ví dụ này không còn Kiểm tra đệ quy các mục nhập bảng trong trình điều khiển con được thêm vào Để xem nếu có bất kỳ trong số họ quan điểm tham khảo. (Nhưng nó sẽ không mở rộngcũhoặcmới- nếu không, chúng ta sẽ có đệ quy vô hạn!) Trong ví dụ này, ở đó không phải là kèo bóng đá pháp viết lại choShoelace_datahoặcĐơn vị, vì vậy việc viết lại đã hoàn tất và Trên đây là kết quả cuối cùng được cung cấp cho người lập kế hoạch.
Bây giờ chúng tôi muốn viết một truy vấn tìm ra đôi giày nào Hiện tại trong cửa hàng, chúng tôi có dây giày phù hợp (màu và chiều dài) và nơi tổng số khớp chính xác các cặp lớn hơn hoặc bằng hai.
Chọn * từ giày_ready trong đó Total_avail = 2; Tên ShoenSy | sh_avail | SL_NAME | SL_AVAIL | Total_avail ----------+----------+----------+----------+------------- Sh1 | 2 | SL1 | 5 | 2 Sh3 | 4 | SL7 | 7 | 4 (2 hàng)
Đầu ra của trình phân tích cú kèo bóng đá pháp lần này là cây truy vấn:
22774_22972
kèo bóng đá pháp đầu tiên được áp dụng sẽ là cái choShoe_Readykèo bóng đá pháp và nó dẫn đến truy vấn cây:
23152_23692
Tương tự, các kèo bóng đá pháp chogiàyvàShoelaceđược thay thế kèo bóng đá phápo Bảng phạm vi của phụ, dẫn đến trận chung kết ba cấp Cây truy vấn:
23943_25206
Hóa ra người lập kế hoạch sẽ thu gọn cây này thành a Cây truy vấn hai cấp: The BottommostChọnlệnh sẽ là"Kéo lên"kèo bóng đá phápo giữaChọnVì không cần phải xử lý chúng riêng. Nhưng giữaChọnWill vẫn tách biệt với đầu, vì nó chứa tổng hợp chức năng. Nếu chúng ta kéo chúng lên, nó sẽ thay đổi hành vi của đỉnh caoChọn, mà chúng ta không muốn. Tuy nhiên, việc sụp đổ cây truy vấn là một tối ưu hóa rằng hệ kèo bóng đá pháp viết lại không phải quan tâm đến chính nó với.
Hai chi tiết của cây truy vấn không được chạm vào Mô tả các kèo bóng đá pháp xem ở trên. Đây là loại lệnh và mối quan hệ kết quả. Trên thực tế, loại lệnh không cần thiết bởi Xem các kèo bóng đá pháp, nhưng mối quan hệ kết quả có thể ảnh hưởng đến cách thức mà Truy vấn viết lại hoạt động, bởi vì cần phải chăm sóc đặc biệt thực hiện nếu mối quan hệ kết quả là một chế độ xem.
Chỉ có một kèo bóng đá phápi sự khác biệt giữa một cây truy vấn cho AChọnvà một cho bất kỳ lệnh nào khác. Rõ ràng, họ có một loại lệnh khác và cho một lệnh Khác với AChọn, kết quả quan hệ chỉ ra mục nhập bảng phạm vi nơi kết quả nên đi. Mọi thứ khác hoàn toàn giống nhau. Vì vậy, có Hai bảngT1vàT2với các cộtAvàB, Cây truy vấn cho hai người Các câu lệnh:
Chọn T2.b từ T1, T2 trong đó t1.a = T2.a; CẬP NHẬT T1 Đặt B = T2.B từ T2 trong đó T1.A = T2.A;
gần như giống hệt nhau. Đặc biệt:
Các bảng phạm vi chứa các mục cho các bảngT1vàT2.
Danh sách mục tiêu chứa một biến chỉ ra CộtB27529_27575T2.
Biểu thức đủ điều kiện so sánh các cộtAcủa cả hai mục bảng phạm vi cho Bình đẳng.
Cây tham gia hiển thị sự kết nối đơn giản giữaT1vàT2.
Hậu quả là cả hai cây truy vấn đều dẫn đến tương tự Kế hoạch thực thi: cả hai đều tham gia trên hai bảng. Vì TheCập nhậtCác cột bị thiếu từT1được thêm kèo bóng đá phápo danh sách mục tiêu bởi Người lập kế hoạch và cây truy vấn cuối cùng sẽ đọc là:
Cập nhật T1 Đặt A = T1.A, B = T2.B từ T2 trong đó T1.A = T2.A;
Và do đó, người thực thi chạy qua tham gia sẽ tạo ra chính xác Kết quả tương tự được đặt như:
Chọn T1.A, T2.b từ T1, T2 trong đó T1.A = T2.A;
Nhưng có một chút vấn đề trongCập nhật: Phần của kế hoạch thực thi Sự tham gia không quan tâm kết quả từ sự tham gia có nghĩa là gì vì. Nó chỉ tạo ra một tập hợp kết quả của các hàng. Thực tế là một là AChọnlệnh và lệnh khác là MỘTCập nhậtđược xử lý cao hơn trong người thực thi, nơi nó biết rằng đây là mộtCập nhậtvà nó biết rằng kết quả này sẽ đi kèo bóng đá phápo bảngT1. Nhưng những hàng nào đó phải được thay thế bằng hàng mới?
Để giải kèo bóng đá phápết vấn đề này, một mục nhập khác được thêm vào Danh sách mục tiêu trongCập nhật(và cả trongXóa) NHẬN DẠNG (CTID). Đây là một hệ kèo bóng đá pháp cột chứa số khối tệp và vị trí trong chặn cho hàng. Biết bảng,CTIDcó thể được sử dụng để lấy bản gốc Hàng củaT1được cập nhật. Sau khi thêm TheCTIDđến danh sách đích, Truy vấn thực sự trông giống như:
Chọn T1.A, T2.B, T1.CTID từ T1, T2 trong đó T1.A = T2.A;
Bây giờ là một chi tiết khác củaPostgreSQLBước kèo bóng đá phápo giai đoạn. Bàn cũ hàng không được ghi đè và đây là lý do tại saorollbacklà nhanh. Trong mộtCập nhật, Hàng kết quả mới được chèn kèo bóng đá phápo bảng (sau khi tướcCTID) và trong tiêu đề hàng của hàng cũ, màCTIDchỉ kèo bóng đá phápo, TheCMAXvàxmax30464_30670
30681_30806
Trên đây cho thấy cách hệ thống kèo bóng đá pháp kết hợp chế độ xem Định nghĩa vào cây truy vấn ban đầu. Trong lần thứ hai Ví dụ, một đơn giảnChọnTừ một chế độ kèo bóng đá pháp đã tạo một cây truy vấn cuối cùng là tham gia 4 bảng (Đơn vịĐã được sử dụng hai lần với khác nhau tên).
31332_31947PostgreSQLĐảm bảo rằng đây là tất cả thông tin có sẵn về truy vấn cho đến điểm đó.
Điều gì xảy ra nếu chế độ kèo bóng đá pháp được đặt tên là mối quan hệ đích cho MỘTChèn, Cập nhậthoặcXóa? Chỉ đơn giản là thực hiện các thay thế được mô tả ở trên sẽ đưa ra một Truy vấn cây trong đó mối quan hệ kết quả chỉ kèo bóng đá phápo một truy vấn con Mục nhập bảng, sẽ không hoạt động. Thay kèo bóng đá phápo đó, người viết lại Giả sử rằng hoạt động sẽ được xử lý bởi mộtthay vì32698_32876Chèn, người viết lại không làm gì ở tất cả với quan điểm, để lại nó là mối quan hệ kết quả cho truy vấn. VìCập nhậtvàXóa, vẫn cần phải mở rộng chế độ kèo bóng đá pháp truy vấn để sản xuất"cũ"hàng đó Lệnh sẽ cố gắng cập nhật hoặc xóa. Vì vậy, quan điểm là Mở rộng như bình thường, nhưng một mục bảng phạm vi chưa được mở rộng khác là thêm kèo bóng đá phápo truy vấn để thể hiện quan điểm trong khả năng của nó là mối quan hệ kết quả.
Vấn đề hiện đang phát sinh là làm thế nào để xác định các hàng để được cập nhật trong chế độ kèo bóng đá pháp. Nhớ lại rằng khi mối quan hệ kết quả là một bảng, một đặc biệtCTIDMục nhập được thêm vào danh sách mục tiêu để xác định vật lý Vị trí của các hàng sẽ được cập nhật. Điều này không hoạt động nếu mối quan hệ kết quả là một chế độ kèo bóng đá pháp, bởi vì một chế độ kèo bóng đá pháp không có bất kỳCTID, vì các hàng của nó không có vị trí vật lý thực tế. Thay kèo bóng đá phápo đó, cho mộtCập nhậthoặcXóaHoạt động, đặc biệtWholerow34065_34210"cũ"hàng đếnthay vì34292_34399
Nếu không cóthay vìTriggers Để cập nhật chế độ xem, người thực thi sẽ gây ra lỗi, bởi vì Nó không thể tự động cập nhật chế độ xem. Để thay đổi Điều này, chúng ta có thể xác định các kèo bóng đá pháp sửa đổi hành vi củaChèn, Cập nhậtvàXóalệnh trên chế độ xem. Các kèo bóng đá pháp này sẽ viết lại lệnh, thường thành một lệnh cập nhật một hoặc nhiều bảng, thay vì quan điểm. Đó là chủ đề của phần tiếp theo.
Lưu ý rằng các kèo bóng đá pháp được đánh giá trước, viết lại bản gốc Truy vấn trước khi nó được lên kế hoạch và thực hiện. Do đó, nếu một chế độ xem cóthay vìTriggers cũng như kèo bóng đá pháp trênChèn, Cập nhậthoặcXóa, sau đó Các kèo bóng đá pháp sẽ được đánh giá đầu tiên và tùy thuộc vào kết quả, Các trình kích hoạt hoàn toàn không được sử dụng.