PostgreSQL | ||
---|---|---|
prev | NEXT |
tỷ lệ kèo bóng đá tối nay quy trình được mô tả cho đến nay cho phép bạn xác định một loại mới, mới Chức năng và toán tử mới. Tuy nhiên, chúng tôi chưa thể định nghĩa một Chỉ mục thứ cấp (như phương thức truy cập B-Tree, R-Tree hoặc Hash) qua một loại mới hoặc toán tử của nó.
Nhìn lạiThe Danh mục hệ thống Postgres lớn. Nửa bên phải cho thấy tỷ lệ kèo bóng đá tối nay danh mục mà chúng ta phải sửa đổi để nói với Postgres cách sử dụng Loại do người dùng định nghĩa và/hoặc người vận hành do người dùng định nghĩa với một chỉ mục (tức là,pg_am, pg_amop, pg_amprocvàPG_OPCLASS). Thật không may, không có lệnh đơn giản để làm điều này. Chúng tôi sẽ trình bày cách sửa đổi những điều này danh mục thông qua một ví dụ đang chạy: một lớp toán tử mới cho Phương pháp truy cập B-Tree sắp xếp tỷ lệ kèo bóng đá tối nay số nguyên trong Tăng dần tuyệt đối thứ tự giá trị.
Thepg_amlớp chứa tỷ lệ kèo bóng đá tối nay trường hợp Đối với mọi phương thức truy cập do người dùng xác định. Hỗ trợ truy cập đống Phương pháp được tích hợp vào postgres, nhưng mọi phương pháp truy cập khác là được mô tả ở đây. Lược đồ là
Bảng 35-1. Lược đồ chỉ mục
thuộc tính | Mô tả |
---|---|
Amname | Tên tỷ lệ kèo bóng đá tối nay phương thức truy cập |
AMOWNER | ID đối tượng tỷ lệ kèo bóng đá tối nay chủ sở hữu ví dụ trong pg_user |
Amkind | hiện tại không được sử dụng, nhưng được đặt thành 'O' với tư cách là người giữ địa điểm |
Amstrargeties | Số lượng chiến lược tỷ lệ kèo bóng đá tối nay việc này Phương thức truy cập (xem bên dưới) |
Amsupport | Số lượng tỷ lệ kèo bóng đá tối nay thói quen hỗ trợ cho Phương thức truy cập này (xem bên dưới) |
Amgettuple Aminsert ... | Định danh thủ tục cho tỷ lệ kèo bóng đá tối nay thói quen giao diện cho phương thức truy cập. Ví dụ, RegProc ID để mở, đóng và nhận tỷ lệ kèo bóng đá tối nay trường hợp từ Phương thức truy cập xuất hiện ở đây. |
ID đối tượng tỷ lệ kèo bóng đá tối nay thể hiện trongPG_AMđược sử dụng làm khóa ngoại trong nhiều lớp khác. Bạn không cần Để thêm một thể hiện mới tỷ lệ kèo bóng đá tối nay lớp này; Tất cả những gì bạn quan tâm là ID đối tượng của thể hiện phương thức truy cập bạn muốn mở rộng:
Chọn OID từ pg_am trong đó amname = 'btree'; +----+ | oid | +----+ | 403 | +----+
TheAmstrargetiesthuộc tính tồn tại Chuẩn hóa so sánh giữa tỷ lệ kèo bóng đá tối nay loại dữ liệu. Ví dụ, cây b Áp đặt một thứ tự nghiêm ngặt đối với tỷ lệ kèo bóng đá tối nay khóa, ít hơn đến lớn hơn. Kể từ Postgres Cho phép người dùng xác định tỷ lệ kèo bóng đá tối nay toán tử, Postgres không thể nhìn vào tên của một toán tử (ví dụ: "" hoặc "<") và cho biết loại nào so sánh nó là. Trên thực tế, một số phương thức truy cập không áp đặt bất kỳ đặt hàng ở tất cả. Ví dụ: r-cây thể hiện một mối quan hệ hình chữ nhật, trong khi cấu trúc dữ liệu băm chỉ thể hiện sự tương đồng bitwise dựa trên giá trị của băm chức năng. Postgres cần một số cách nhất quán để thực hiện Trình độ chuyên môn trong truy vấn của bạn, nhìn vào người vận hành và sau đó Quyết định nếu một chỉ số có thể sử dụng tồn tại. Điều này ngụ ý rằng nhu cầu của Postgres để biết, ví dụ, tỷ lệ kèo bóng đá tối nay toán tử "<=" và "" Phân vùng một cây b. Postgres sử dụng tỷ lệ kèo bóng đá tối nay chiến lược để thể hiện những điều này mối quan hệ giữa tỷ lệ kèo bóng đá tối nay nhà khai thác và cách chúng có thể được sử dụng để Quét chỉ số.
Xác định một bộ chiến lược mới nằm ngoài phạm vi của điều này thảo luận, nhưng chúng tôi sẽ giải thích cách thức hoạt động của tỷ lệ kèo bóng đá tối nay chiến lược B-cây vì Bạn sẽ cần biết rằng để thêm một lớp toán tử mới. Trongpg_amLớp, thuộc tính Amstrargeties là số lượng tỷ lệ kèo bóng đá tối nay chiến lược được xác định cho phương pháp truy cập này. Vì B-cây, con số này là 5. Những chiến lược này tương ứng với
Bảng 35-2. Chiến lược B-Tree
hoạt động | index |
---|---|
Ít hơn | 1 |
nhỏ hơn hoặc bằng | 2 |
bằng | 3 |
lớn hơn hoặc bằng | 4 |
lớn hơn | 5 |
Ý tưởng là bạn sẽ cần thêm tỷ lệ kèo bóng đá tối nay quy trình tương ứng với so sánh ở trên vớipg_amopMối quan hệ (xem bên dưới). Mã phương thức truy cập có thể sử dụng tỷ lệ kèo bóng đá tối nay chiến lược này tỷ lệ kèo bóng đá tối nay số, bất kể kiểu dữ liệu, để tìm ra cách phân vùng B-cây, tính toán chọn lọc, v.v. Đừng lo lắng về Chi tiết thêm tỷ lệ kèo bóng đá tối nay thủ tục chưa; Chỉ hiểu rằng phải là một tập hợp tỷ lệ kèo bóng đá tối nay quy trình này choINT2, INT4, oid,và mọi loại dữ liệu khác mà một cây B có thể hoạt động. Đôi khi, tỷ lệ kèo bóng đá tối nay chiến lược không đủ thông tin để hệ thống Chỉ ra cách sử dụng một chỉ mục. Một số phương pháp truy cập yêu cầu khác Hỗ trợ thói quen để làm việc. Ví dụ: truy cập cây B Phương pháp phải có khả năng so sánh hai khóa và xác định xem một lớn hơn, bằng hoặc ít hơn so với cái khác. Tương tự, Phương thức truy cập r-tree phải có khả năng tính toán tỷ lệ kèo bóng đá tối nay giao lộ, công đoàn, và kích thước của hình chữ nhật. tỷ lệ kèo bóng đá tối nay hoạt động này không tương ứng với người dùng trình độ chuyên môn trong truy vấn SQL; Họ là những thói quen hành chính Được sử dụng bởi tỷ lệ kèo bóng đá tối nay phương thức truy cập, bên trong.
Để quản lý tỷ lệ kèo bóng đá tối nay thói quen hỗ trợ đa dạng một cách nhất quán Tất cả tỷ lệ kèo bóng đá tối nay phương thức truy cập Postgres,pg_amBao gồm tỷ lệ kèo bóng đá tối nay thuộc tính gọi làAmsupport. Thuộc tính này ghi lại số lượng tỷ lệ kèo bóng đá tối nay thói quen hỗ trợ được sử dụng bởi Phương thức truy cập. Đối với cây B, con số này là một-thói quen Lấy hai phím và trả lại -1, 0 hoặc +1, tùy thuộc vào việc phím thứ nhất nhỏ hơn, bằng hoặc lớn hơn thứ hai.
Lưu ý:Nói đúng ra, thói quen này có thể trả lại Số âm (<0), 0 hoặc số dương khác không ( 0).
TheAmstrargetiesmục nhập trong pg_am là Chỉ số lượng chiến lược được xác định cho phương thức truy cập trong câu hỏi. tỷ lệ kèo bóng đá tối nay thủ tục cho ít hơn, ít bằng nhau, v.v. không xuất hiện trongpg_am. Tương tự,Amsupportchỉ là số lượng tỷ lệ kèo bóng đá tối nay thói quen hỗ trợ yêu cầu bởi phương thức truy cập. tỷ lệ kèo bóng đá tối nay thói quen thực tế được liệt kê nơi khác.
Lớp quan tâm tiếp theo là PG_OPCLASS. Lớp này chỉ tồn tại để liên kết một tên với một oid. Trong pg_amop, mọi toán tử B-cây Lớp có một tập hợp tỷ lệ kèo bóng đá tối nay thủ tục, một đến năm, ở trên. Một số OPCLASS hiện có làint2_ops, int4_ops và oid_ops. Bạn cần thêm tỷ lệ kèo bóng đá tối nay thể hiện với tên op class của bạn (Ví dụ,Complex_abs_ops) đếnPG_OPCLASS. TheOIDcủa trường hợp này là một khóa ngoại trong khác tỷ lệ kèo bóng đá tối nay lớp.
Chèn vào tỷ lệ kèo bóng đá tối nay giá trị pg_opclass (opcname) ('phức tạp_abs_ops'); Chọn oid, opcname Từ pg_opclass Trong đó opcname = 'Complex_abs_ops'; +------+--------------+ | oid | opcname | +------+--------------+ | 17314 | INT4_ABS_OPS | +------+--------------+Lưu ý rằng oid tỷ lệ kèo bóng đá tối nay bạnPG_OPCLASSVí dụ sẽ khác! Bạn nên thay thế giá trị của bạn tỷ lệ kèo bóng đá tối nay 17314 bất cứ nơi nào nó xuất hiện trong này cuộc thảo luận.
Vì vậy, bây giờ chúng tôi có một phương thức truy cập và một lớp toán tử. Chúng tôi vẫn còn cần một bộ toán tử; Thủ tục xác định tỷ lệ kèo bóng đá tối nay nhà khai thác là thảo luận trước đó trong hướng dẫn này. Đối với toán tử Complex_abs_ops lớp trên btrees, tỷ lệ kèo bóng đá tối nay toán tử chúng tôi yêu cầu là:
Giá trị tuyệt đối ít hơn Giá trị tuyệt đối ít hơn hoặc bình đẳng giá trị tuyệt đối bằng nhau Giá trị tuyệt đối lớn hơn hoặc bình đẳng Giá trị tuyệt đối lớn hơn
Giả sử mã thực hiện tỷ lệ kèo bóng đá tối nay chức năng được xác định được lưu trữ Trong tệpPGROOT/SRC/Hướng dẫn/phức tạp.C
Một phần của mã trông như thế này: (Lưu ý rằng chúng tôi sẽ chỉ hiển thị toán tử bình đẳng cho phần còn lại của tỷ lệ kèo bóng đá tối nay ví dụ. Bốn người kia tỷ lệ kèo bóng đá tối nay nhà khai thác rất giống nhau. Tham khảophức tạp.choặcComplex.sqlĐể biết chi tiết.)
#Define mag (c) ((c)- x*(c)- x + (c)- y*(c)- y) bool Complex_abs_eq (phức tạp *A, phức tạp *B) double amag = mag (a), bmag = mag (b); Trả lại (AMAG == BMAG);
Có tỷ lệ kèo bóng đá tối nay vài điều quan trọng đang xảy ra dưới.
Đầu tiên, lưu ý rằng tỷ lệ kèo bóng đá tối nay toán tử cho ít hơn, kém hơn hoặc bằng nhau, bằng nhau, lớn hơn hoặc bình đẳng và lớn hơn so vớiINT4đang được xác định. Tất cả tỷ lệ kèo bóng đá tối nay nhà khai thác này là đã được xác định choINT4dưới tên <, <=, =, =, và. tỷ lệ kèo bóng đá tối nay nhà khai thác mới cư xử Khác nhau, tất nhiên. Để đảm bảo rằng Postgres sử dụng những nhà khai thác mới này chứ không phải là những người cũ, chúng cần được đặt tên khác với những người cũ. Đây là một điểm quan trọng: bạn có thể tỷ lệ kèo bóng đá tối nay toán tử quá tải trong postgres, nhưng chỉ khi người vận hành không đã được xác định cho tỷ lệ kèo bóng đá tối nay loại đối số. Đó là, nếu bạn có < Được xác định cho (int4, int4), bạn không thể xác định lại. Postgres không Không kiểm tra điều này khi bạn xác định toán tử của mình, vì vậy hãy cẩn thận. ĐẾN Tránh vấn đề này, tên lẻ sẽ được sử dụng cho tỷ lệ kèo bóng đá tối nay nhà khai thác. Nếu như Bạn hiểu sai điều này, tỷ lệ kèo bóng đá tối nay phương thức truy cập có khả năng bị sập khi bạn cố gắng quét.
Điểm quan trọng khác là tất cả tỷ lệ kèo bóng đá tối nay chức năng của toán tử trả về giá trị boolean. tỷ lệ kèo bóng đá tối nay phương pháp truy cập dựa vào thực tế này. (TRÊN mặt khác, chức năng hỗ trợ trả về bất cứ điều gì Phương thức truy cập cụ thể mong đợi - trong trường hợp này, một Integer.) Thói quen cuối cùng trong tệp là "thói quen hỗ trợ" đã đề cập khi chúng tôi đã thảo luận về thuộc tính amsupport củapg_amlớp. Chúng tôi sẽ sử dụng điều này sau này. Bây giờ, bỏ qua nó.
Tạo chức năng Complex_abs_eq (phức tạp, phức tạp) Trả lại bool Như 'pgroot/hướng dẫn/obj/phức tạp.so' Ngôn ngữ 'C';
Bây giờ xác định tỷ lệ kèo bóng đá tối nay toán tử sử dụng chúng. Như đã lưu ý, nhà điều hành Tên phải là duy nhất trong số tất cả tỷ lệ kèo bóng đá tối nay toán tử mất haiINT4Toán tử. Để xem người vận hành có Tên được liệt kê dưới đây được thực hiện, chúng tôi có thể thực hiện tỷ lệ kèo bóng đá tối nay truy vấn trênpg_operator:
/* * Truy vấn này sử dụng toán tử biểu thức thông thường (~) * Để tìm tên toán tử ba ký tự kết thúc * Nhân vật & */ LỰA CHỌN * Từ PG_Operator Trong đó oprname ~ '^.. & $' :: text;
Để xem tên của bạn có được lấy cho tỷ lệ kèo bóng đá tối nay loại bạn muốn không. tỷ lệ kèo bóng đá tối nay Những điều quan trọng ở đây là tỷ lệ kèo bóng đá tối nay thủ tục (là tỷ lệ kèo bóng đá tối nay chức năng C được xác định ở trên) và tỷ lệ kèo bóng đá tối nay chức năng chọn lọc và tham gia. Bạn chỉ nên sử dụng những cái được sử dụng dưới đây-mới có tỷ lệ kèo bóng đá tối nay chức năng khác nhau như vậy cho ít hơn, bình đẳng và lớn hơn trường hợp. Chúng phải được cung cấp hoặc phương pháp truy cập sẽ bị sập khi Nó cố gắng sử dụng toán tử. Bạn nên sao chép tên cho Hạn chế và tham gia, nhưng sử dụng tỷ lệ kèo bóng đá tối nay tên thủ tục mà bạn đã xác định trong Bước cuối cùng.
Tạo toán tử = ( Leftarg = Complex, RightArg = Complex, Quy trình = Complex_abs_eq, hạn chế = eqsel, tham gia = eqjoinsel )
Lưu ý rằng năm toán tử tương ứng với ít hơn, ít bằng nhau, bằng nhau, lớn hơn và bằng nhau được xác định.
Chúng tôi vừa hoàn thành. Điều cuối cùng chúng ta cần làm là Cập nhậtPG_AMOPMối quan hệ. Để làm điều này, Chúng ta cần tỷ lệ kèo bóng đá tối nay thuộc tính sau:
Bảng 35-3.pg_amproclược đồ
thuộc tính | Mô tả |
---|---|
Amopid | TheOIDtỷ lệ kèo bóng đá tối naypg_amphiên bản tỷ lệ kèo bóng đá tối nay B-Tree (== 403, xem ở trên) |
Amopclaid | Theoidtỷ lệ kèo bóng đá tối nayPG_OPCLASSphiên bản tỷ lệ kèo bóng đá tối nayINT4_ABS_OPS(== bất cứ điều gì bạn có thay vì17314, xem ở trên) |
Amopopr | Theoids của tỷ lệ kèo bóng đá tối nay toán tử cho opclass (mà Chúng ta sẽ chỉ nhận được chỉ trong một phút) |
amopselect, amopnpages | Hàm chi phí |
Vì vậy, chúng ta cầnoids của tỷ lệ kèo bóng đá tối nay toán tử Chúng tôi chỉ xác định. Chúng tôi sẽ tra cứu tên của tất cả tỷ lệ kèo bóng đá tối nay nhà khai thác Lấy haiINT4s và chọn ra tỷ lệ kèo bóng đá tối nay chúng tôi:
Chọn O.Oid là Opoid, O.Oprname Vào bảng phức hợp_ops_tmp Từ pg_operator o, pg_type t Trong đó o.oprleft = t.oid và o.oprrrr net = t.oid và t.typName = 'phức tạp'; +------+----------+ | oid | oprname | +------+----------+ | 17321 | <| +------+----------+ | 17322 | <= | +------+----------+ | 17323 | = | +------+----------+ | 17324 | = | +------+----------+ | 17325 | | +------+---------+(tỷ lệ kèo bóng đá tối nay lần nữa, tỷ lệ kèo bóng đá tối nay số của bạnOIDSố gần như chắc chắn sẽ khác.) tỷ lệ kèo bóng đá tối nay nhà khai thác chúng ta đang quan tâm đến những người cóOIDS 17321 đến năm 17325. tỷ lệ kèo bóng đá tối nay giá trị bạn nhận được có thể sẽ khác nhau, và Bạn nên thay thế chúng cho tỷ lệ kèo bóng đá tối nay giá trị dưới đây. Chúng ta có thể nhìn vào Tên người vận hành và chọn ra những tên chúng tôi vừa thêm.
Bây giờ chúng tôi đã sẵn sàng để cập nhậtPG_AMOPvới Lớp toán tử mới của chúng tôi. Điều quan trọng nhất trong toàn bộ thảo luận là tỷ lệ kèo bóng đá tối nay nhà khai thác được đặt hàng, từ ít bằng nhau thông qua lớn hơn, trongPG_AMOP. Chúng tôi thêm tỷ lệ kèo bóng đá tối nay trường hợp chúng ta cần:
Chèn vào pg_amop (amopid, amopclaid, Amopopp, Amopstrargety, Amopselect, amopnpages) Chọn am.oid, opcl.oid, c.opoid, 3, 'Btreesel' :: RegProc, 'BtreenPage' :: RegProc Từ pg_am am, pg_opclass opcl, comple_ops_tmp c Trong đó amname = 'btree' và opcname = 'Complex_abs_ops' và c.oprname = '=';Lưu ý thứ tự: "nhỏ hơn" là 1, "nhỏ hơn hoặc bằng" là 2, "bằng" là 3, "lớn hơn hoặc bằng" là 4 và "lớn hơn" là 5.
Bước cuối cùng (cuối cùng!) Là đăng ký tỷ lệ kèo bóng đá tối nay "Hỗ trợ thường xuyên "được mô tả trước đây trong cuộc thảo luận tỷ lệ kèo bóng đá tối nay chúng tôi vềpg_am. Theoidtỷ lệ kèo bóng đá tối nay điều này thói quen hỗ trợ được lưu trữ trongpg_amproclớp, được khóa bởi phương thức truy cậpoidvà lớp toán tửoid. Đầu tiên, chúng ta cần đăng ký chức năng trong Postgres (nhớ lại rằng chúng tôi đặt mã C thực hiện điều này định kỳ ở cuối tệp mà chúng tôi đã triển khai thói quen vận hành):
Tạo hàm int4_ABS_CMP (INT4, INT4) Trả về int4 Như 'pgroot/hướng dẫn/obj/phức tạp.so' Ngôn ngữ 'c'; Chọn oid, proname từ pg_proc Trong đó prname = 'int4_abs_cmp'; +------+--------------+ | oid | tuyên bố | +------+--------------+ | 17328 | INT4_ABS_CMP | +------+--------------+(tỷ lệ kèo bóng đá tối nay lần nữa, của bạnOIDsố sẽ có lẽ là khác nhau và bạn nên thay thế giá trị bạn thấy Đối với giá trị bên dưới.) Nhớ lại rằng OID tỷ lệ kèo bóng đá tối nay phiên bản B-Tree là 403 và tỷ lệ kèo bóng đá tối nayINT4_ABS_OPSlà 17314, chúng tôi có thể thêm thể hiện mới như sau:
Chèn vào pg_amproc (giữa, Amopclaid, AMProc, AMProcnum) tỷ lệ kèo bóng đá tối nay giá trị ('403' :: oid, - btree oid '17314' :: oid, - pg_opclass tuple '17328' :: oid, - pg_proc oid mới '1' :: int2);
prev | Trang chủ | NEXT |
Mở rộng SQL: Tổng hợp | UP | Chỉ số Gist |