kèo bóng đá c1 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 (chẳng hạn nhưB-cây, R-Treehoặc phương thức truy cập băm) trên kèo bóng đá c1 Loại mới hoặc toán tử của nó.
Nhìn lạiHệ thống Postgres chính Danh mục. Nửa phải hiển thị kèo bóng đá c1 danh mục mà chúng ta phải sửa đổi Để nóiPostgresCách làm 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 kèo bóng đá c1 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 kèo bóng đá c1B-câyPhương pháp truy cập sắp xếp số nguyên theo thứ tự giá trị tuyệt đối tăng dần.
ThePG_AMlớp chứa kèo bóng đá c1 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 thức được tích hợp vàoPostgres, nhưng Mọi phương pháp truy cập khác được mô tả ở đây. Lược đồ là
Bảng 44-1. Lược đồ chỉ mục
thuộc tính | Mô tả |
---|---|
Amname | Tên của phương thức truy cập |
AMOWNER | ID đối tượng của 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 kèo bóng đá c1 việc này Phương thức truy cập (xem bên dưới) |
Amsupport | Số lượng kèo bóng đá c1 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 kèo bóng đá c1 thói quen giao diện cho phương thức truy cập. Ví dụ, RegProc ID để mở, đóng và nhận kèo bóng đá c1 trường hợp từ Phương thức truy cập xuất hiện ở đây. |
TheID đối tượngcủa trường hợp trongpg_amđược sử dụng làm khóa ngoại trong rất nhiều kèo bóng đá c1 lớp khác. Bạn không cần thêm một thể hiện mới vào lớp này; Tất cả những gì bạn quan tâm làĐối tượng NHẬN DẠNGcủa phiên bản phương thức truy cập bạn muốn kèo bóng đá c1:
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 kèo bóng đá c1 loại dữ liệu. Ví dụ,B-TreeS áp đặt đơn đặt hàng nghiêm ngặt Chìa khóa, ít hơn đến lớn hơn. TừPostgresCho phép người dùng xác định kèo bóng đá c1 toán tử,PostgresKhông thể nhìn vào tên của một toán tử (ví dụ: "" hoặc "<") và kèo bóng đá c1 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-Trees thể hiện mối quan hệ hình chữ nhật, trong khi dữ liệu băm cấu trúc chỉ thể hiện sự tương đồng bitwise dựa trên giá trị của kèo bóng đá c1 hàm băm.PostgresCần kèo bóng đá c1 số cách phù hợp để thực hiện kèo bóng đá c1 vòng loại trong truy vấn của bạn, nhìn vào Nhà điều hành và sau đó quyết định nếu kèo bóng đá c1 chỉ số có thể sử dụng tồn tại. Cái này ngụ ý rằngPostgresCần Ví dụ, biết rằng phân vùng toán tử "<=" và "" kèo bóng đá c1B-Tree. PostgresSử dụng kèo bóng đá c1 chiến lược để thể hiện những điều này mối quan hệ giữa kèo bóng đá c1 nhà khai thác và cách chúng có thể được sử dụng để Quét chỉ số.
Xác định kèo bóng đá c1 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 làm thế nàoB-TreeChiến lược làm việc vì bạn sẽ cần biết Điều đó để thêm kèo bóng đá c1 lớp toán tử mới. Trongpg_amlớp, thuộc tính Amstrargeties là Số lượng chiến lược được xác định kèo bóng đá c1 phương pháp truy cập này. VìB-câys, số này là 5. kèo bóng đá c1 chiến lược tương ứng với
Bảng 44-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 kèo bóng đá c1 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 kèo bóng đá c1 chiến lược này kèo bóng đá c1 số, bất kể kiểu dữ liệu, để tìm ra cách phân vùng TheB-cây, tính toán chọn lọc và sớm. Đừng lo lắng về kèo bóng đá c1 chi tiết của việc thêm kèo bóng đá c1 thủ tục; chỉ hiểu rằng phải có một tập hợp kèo bóng đá c1 quy trình này choint2, int4, oid,và mọi dữ liệu khác Nhập vào đóB-câyCó thể vận hành. Đôi khi, kèo bóng đá c1 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ụ:B-câyPhương pháp truy cập phải có thể so sánh hai Chìa khóa và xác định xem kèo bóng đá c1 người lớn hơn, bằng hoặc ít hơn hơn cái khác. Tương tự,r-treePhương pháp truy cập phải có khả năng tính toán kèo bóng đá c1 giao lộ, công đoàn và Kích thước của hình chữ nhật. kèo bóng đá c1 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 kèo bóng đá c1 phương thức truy cập, bên trong.
Để quản lý kèo bóng đá c1 thói quen hỗ trợ đa dạng một cách nhất quán tất cảPostgresPhương pháp truy cập,pg_amBao gồm kèo bóng đá c1 thuộc tính gọi làAmsupport. Thuộc tính này ghi lại Số lượng kèo bóng đá c1 thói quen hỗ trợ được sử dụng bởi một phương thức truy cập. VìB-câys, số này là một - định kỳ để lấy hai phím và trả lại -1, 0 hoặc +1, tùy thuộc vào kèo bóng đá c1 dù khóa đầu tiên 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 a 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. kèo bóng đá c1 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 kèo bóng đá c1 thói quen hỗ trợ yêu cầu bởi phương thức truy cập. kèo bóng đá c1 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 kèo bóng đá c1 tên với kèo bóng đá c1 oid. Trong pg_amop, mọiB-câyLớp toán tử có kèo bóng đá c1 bộ quy trình, kèo bóng đá c1 đến năm, ở trên. kèo bóng đá c1 số opclass hiện có làINT2_OPS, INT4_OPS và OID_OPS. Bạn cần thêm kèo bóng đá c1 ví dụ với tên opClass 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 kèo bóng đá c1 lớp khác.
chèn vào kèo bóng đá c1 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 kèo bóng đá c1 bạnPG_OPCLASSVí dụ sẽ khác! Bạn nên thay thế giá trị của bạn kèo bóng đá c1 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 kèo bóng đá c1 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, kèo bóng đá c1 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 kèo bóng đá c1 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 kèo bóng đá c1 ví dụ. Bốn người kia kèo bóng đá c1 nhà khai thác rất giống nhau. Tham khảophức tạp.choặcComplex.sqlĐối với kèo bóng đá c1 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ó kèo bóng đá c1 vài điều quan trọng đang xảy ra dưới.
Đầu tiên, lưu ý rằng kèo bóng đá c1 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ả kèo bóng đá c1 nhà khai thác này là đã được xác định choINT4dưới tên <, <=, =, =, và. kèo bóng đá c1 nhà khai thác mới cư xử Khác nhau, tất nhiên. Để đảm bảo rằngPostgresSử dụng kèo bóng đá c1 toán tử mới này chứ không phải Những người cũ, họ 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ể quá tải kèo bóng đá c1 toán tử trongPostgres, nhưng chỉ khi người vận hành không đã được xác định cho kèo bóng đá c1 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.PostgresKhông kiểm tra điều này khi bạn xác định Nhà điều hành của bạn, vì vậy hãy cẩn thận. Để tránh vấn đề này, những cái tên lẻ sẽ được sử dụng cho kèo bóng đá c1 nhà khai thác. Nếu bạn hiểu sai, quyền truy cập kèo bóng đá c1 phương thức 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ả kèo bóng đá c1 chức năng của toán tử trả về giá trị boolean. kèo bóng đá c1 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 kèo bóng đá c1 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ả kèo bóng đá c1 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 kèo bóng đá c1 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 kèo bóng đá c1 loại bạn muốn không. kèo bóng đá c1 Những điều quan trọng ở đây là thủ tục (đó làCkèo bóng đá c1 chức năng được xác định ở trên) và hạn chế và Tham gia kèo bóng đá c1 chức năng chọn lọc. Bạn chỉ nên sử dụng những cái được sử dụng Dưới đây-mới có kèo bóng đá c1 chức năng khác nhau như vậy cho ít hơn so với, bình đẳng và kèo bóng đá c1 trường hợp lớn hơn. Những thứ này phải được cung cấp, hoặc phương thức 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 để hạn chế và tham gia, nhưng sử dụng Tên thủ tục 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 kèo bóng đá c1 thuộc tính sau:
Bảng 44-3.pg_amproclược đồ
thuộc tính | Mô tả |
---|---|
Amopid | Theoidcủapg_amphiên bản kèo bóng đá c1 B-Tree (== 403, xem ở trên) |
Amopclaid | TheoidcủaPG_OPCLASSphiên bản kèo bóng đá c1INT4_ABS_OPS(== bất cứ điều gì bạn có thay vì17314, xem ở trên) |
Amopopr | TheoidS của kèo bóng đá c1 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 kèo bóng đá c1 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ả kèo bóng đá c1 nhà khai thác Lấy haiINT4S và chọn ra của 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 | | +------+---------+(kèo bóng đá c1 lần nữa, kèo bóng đá c1 số của bạnoidSố gần như chắc chắn sẽ khác.) kèo bóng đá c1 nhà khai thác chúng ta đang quan tâm đến những người cóoidS 17321 đến năm 17325. kèo bóng đá c1 giá trị bạn nhận được có thể sẽ khác nhau, và Bạn nên thay thế chúng cho kèo bóng đá c1 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à kèo bóng đá c1 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 kèo bóng đá c1 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ý của "Hỗ trợ thường xuyên "được mô tả trước đây trong cuộc thảo luận của chúng tôi vềpg_am. TheOIDcủa đ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 trongPostgres(Nhớ lại rằng chúng tôi đặtCMã thực hiện thói quen này trong đáy của tệp mà chúng tôi đã triển khai toán tử kèo bóng đá c1 thói quen):
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 | +------+--------------+(kèo bóng đá c1 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ằngB-câyOID của phiên bản là 403 và củaINT4_ABS_OPSIS 17314, chúng ta có thể thêm cái mới ví dụ như sau:
24120_24331