kèo chấp bóng đá hôm 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 (chẳng hạn nhưB-Tree, R-Treehoặc phương thức truy cập băm) trên một 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 chấp bóng đá hôm nay 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 một chỉ mục (tức là,pg_am, pg_amop, pg_amproc, pg_operatorvà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 diễn cách sửa đổi kèo chấp bóng đá hôm nay danh mục này thông qua một ví dụ đang chạy: một lớp toán tử mới choB-câyPhương pháp truy cập lưu trữ và sắp xếp kèo chấp bóng đá hôm nay số phức tạp trong tăng dần Thứ tự giá trị tuyệt đối.
Thepg_amlớp chứa một 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 43-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 |
Amstrargeties | Số lượng chiến lược kèo chấp bóng đá hôm nay việc này Phương thức truy cập (xem bên dưới) |
Amsupport | Số lượng kèo chấp bóng đá hôm nay thói quen hỗ trợ cho Phương thức truy cập này (xem bên dưới) |
AmorderStrargety | số không nếu chỉ mục cung cấp không sắp xếp thứ tự, nếu không là số chiến lược của chiến lược toán tử mô tả thứ tự sắp xếp |
Amgettuple | |
Aminsert | |
... | Định danh thủ tục cho kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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 mở rộng:
Chọn oid từ pg_am trong đó amname = 'btree'; oid ----- 403 (1 hàng)kèo chấp bóng đá hôm nay tôi sẽ sử dụng điều đóChọntrong Atrong đómệnh đề sau.
TheAmstrargetiesthuộc tính tồn tại Chuẩn hóa so sánh giữa kèo chấp bóng đá hôm nay loại dữ liệu. Ví dụ,B-TreeS áp đặt một thứ tự 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 chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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 một hàm băm.PostgresCần một số cách phù hợp để thực hiện một 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 một 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à "" MộtB-cây. Postgressử dụng kèo chấp bóng đá hôm nay chiến lược để thể hiện những điều này mối quan hệ giữa kèo chấp bóng đá hôm 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 kèo chấp bóng đá hôm nay tôi sẽ giải thích làm thế nàoB-câyChiến lược làm việc vì bạn sẽ cần biết Điều đó để thêm một 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 chấp bóng đá hôm nay phương pháp truy cập này. VìB-câys, số này là 5. kèo chấp bóng đá hôm nay chiến lược tương ứng với
Bảng 43-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 chấp bóng đá hôm 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 kèo chấp bóng đá hôm nay chiến lược này kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay chi tiết của việc thêm kèo chấp bóng đá hôm nay thủ tục; chỉ hiểu rằng phải có một tập hợp kèo chấp bóng đá hôm nay quy trình này choint2, int4, oid,và mọi dữ liệu khác Nhập vào đóB-câyCan vận hành.
Đôi khi, kèo chấp bóng đá hôm nay chiến lược không đủ thông tin cho hệ thống Để tìm 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 kèo chấp bóng đá hôm nay thói quen hỗ trợ khác để làm việc. Ví dụ:B-câyPhương pháp truy cập phải có thể So sánh hai khóa và xác định xem một khóa có lớn hơn không, bằng nhau đến, hoặc ít hơn cái khác. Tương tự,r-câyPhương pháp truy cập phải có thể tính toán Giao lộ, công đoàn và kích thước của hình chữ nhật. Những hoạt động này làm không tương ứng với trình độ người dùng trong kèo chấp bóng đá hôm nay truy vấn SQL; Họ là kèo chấp bóng đá hôm nay thói quen quản trị được sử dụng bởi kèo chấp bóng đá hôm nay phương thức truy cập, bên trong.
Để quản lý kèo chấp bóng đá hôm nay 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 một thuộc tính gọi làAmsupport. Thuộc tính này ghi lại Số lượng kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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 Số âm (<0), 0 hoặc số dương khác không ( 0).
TheAmstrargetiesmục nhậpPG_AMchỉ là số lượng chiến lược được xác định cho Phương pháp truy cập trong câu hỏi. kèo chấp bóng đá hôm nay thủ tục cho ít hơn, ít hơn bằng nhau, v.v. không xuất hiện trongpg_am. Tương tự,Amsupportchỉ là số của kèo chấp bóng đá hôm nay thói quen hỗ trợ theo yêu cầu của phương thức truy cập. Thực tế kèo chấp bóng đá hôm nay thói quen được liệt kê ở nơi khác.
Nhân tiện,AmorderStrargetymục nhập kèo chấp bóng đá hôm nay biết liệu phương thức truy cập có hỗ trợ quét được đặt hàng hay không. Không có nghĩa là nó không; Nếu có,AmorderStrargetylà số của thói quen chiến lược tương ứng với người vận hành đặt hàng. Ví dụ: Btree cóAmorderStrargety= 1 là "ít hơn" của nó " Số chiến lượ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 lớp toán tử và có lẽ là loại mặc định với toán tử lớp oid. Một số opclass hiện có làint2_ops, int4_ops,vàOID_OPS. Bạn cần thêm một ví dụ với Tên OPCLASS (ví dụ:Complex_abs_ops) đếnPG_OPCLASS. Theoidcủa Trường hợp này sẽ là một khóa ngoại trong kèo chấp bóng đá hôm nay lớp khác, đáng chú ý làpg_amop.
Chèn vào pg_opclass (opcname, opcDeftType) Chọn 'Complex_abs_ops', oid từ pg_type trong đó typname = 'phức tạp'; Chọn OID, OPCNAME, OPCDEFTYPE Từ pg_opclass Trong đó opcname = 'Complex_abs_ops'; oid | opcname | OpcDeftType --------+---------------------+------------ 277975 | Complex_abs_ops | 277946 (1 hàng)Lưu ý rằng oid kèo chấp bóng đá hôm nay bạnPG_OPCLASSVí dụ sẽ khác! Đừng lo về điều này mặc dù. kèo chấp bóng đá hôm nay tôi sẽ nhận được số này từ hệ thống sau này chỉ Giống như kèo chấp bóng đá hôm nay ta có oid của loại ở đây.
Ví dụ trên giả định rằng bạn muốn thực hiện OPClass mới này Chỉ mục mặc định opclass kèo chấp bóng đá hôm nayphức tạpKiểu dữ liệu. Nếu bạn không, chỉ cần chèn 0 vàoOpcDeftType, thay vì chèn oid:
Chèn vào kèo chấp bóng đá hôm nay giá trị pg_opClass (opcName, opcDeftType) ('comple
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 chấp bóng đá hôm nay nhà khai thác là thảo luận trước đó trong hướng dẫn này. ChoComplex_abs_opsLớp toán tử trên btrees, The người vận hành kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm 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ã C 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 chấp bóng đá hôm nay ví dụ. Bốn người kia kèo chấp bóng đá hôm nay nhà khai thác rất giống nhau. Tham khảophức tạp.choặcphức tạp.sourceĐối với kèo chấp bóng đá hôm nay 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);
Chúng tôi làm cho chức năng được biết đến với kèo chấp bóng đá hôm nay postgres như thế này:
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';
Có một số điều quan trọng đang xảy ra ở đây.
Đầu tiên, lưu ý rằng kèo chấp bóng đá hôm nay toán tử cho ít hơn, kém hơn hoặc bình đẳng, bằng nhau, lớn hơn hoặc bình đẳng và lớn hơn so vớiphức tạpđang được xác định. kèo chấp bóng đá hôm nay ta chỉ có thể có một toán tử tên, giả sử, = và lấy loạiphức tạpkèo chấp bóng đá hôm nay cả hai toán hạng. Trong trường hợp này, chúng tôi không có bất kỳ toán tử nào khác = kèo chấp bóng đá hôm nayphức tạp,, Nhưng nếu chúng ta đang xây dựng một kiểu dữ liệu thực tế, chúng ta có thể muốn = là hoạt động bình đẳng thông thường cho kèo chấp bóng đá hôm nay số phức. Trong đó trường hợp, chúng tôi cần sử dụng một số tên toán tử khác cho Complex_abs_eq.
Thứ hai, mặc dù Postgres có thể đối phó với kèo chấp bóng đá hôm nay toán tử có cùng tên là miễn là chúng có kèo chấp bóng đá hôm nay kiểu dữ liệu đầu vào khác nhau, C có thể Chỉ đối phó với một thói quen toàn cầu có một tên nhất định, thời gian. Vì thế Chúng ta không nên đặt tên cho chức năng c một cái gì đó đơn giản nhưabs_eq. Thông thường đó là một thực hành tốt để bao gồm Tên kiểu dữ liệu trong tên hàm C, để không xung đột với Chức năng cho kèo chấp bóng đá hôm nay kiểu dữ liệu khác.
Thứ ba, kèo chấp bóng đá hôm nay ta có thể đã đặt tên Postgres của hàmabs_eq, dựa vào Postgres to to Phân biệt nó bằng kèo chấp bóng đá hôm nay kiểu dữ liệu đầu vào với bất kỳ chức năng postgres nào khác cùng tên. Để giữ cho ví dụ đơn giản, chúng tôi làm cho chức năng có cùng tên ở cấp độ C và cấp độ postgres.
Cuối cùng, lưu ý rằng kèo chấp bóng đá hôm nay chức năng toán tử này trả về Boolean giá trị. kèo chấp bóng đá hôm nay phương pháp truy cập dựa vào thực tế này. (Mặt khác, chức năng hỗ trợ trả về bất kỳ phương thức truy cập cụ thể nào mong đợi - trong trường hợp này, một số nguyên đã ký.) thói quen cuối cùng trong Tệp là "thói quen hỗ trợ" được đề cập khi chúng ta đã thảo luận thuộc tính amsupport củapg_amlớp. kèo chấp bóng đá hôm nay tôi sẽ sử dụng điều này sau này. Bây giờ, bỏ qua nó.
Bây giờ chúng tôi đã sẵn sàng xác định kèo chấp bóng đá hôm nay toán tử:
Tạo toán tử = ( Leftarg = Complex, RightArg = Complex, Quy trình = Complex_abs_eq, hạn chế = eqsel, tham gia = eqjoinsel )Những điều quan trọng ở đây là kèo chấp bóng đá hôm nay tên thủ tục (đó là TheCkèo chấp bóng đá hôm nay chức năng được xác định ở trên) và Hạn chế và tham gia kèo chấp bóng đá hôm nay chức năng chọn lọc. Bạn chỉ nên sử dụng kèo chấp bóng đá hôm nay hàm chọn lọc được sử dụng trong ví dụ (xemComplex.source). Lưu ý rằng có những khác nhau như vậy kèo chấp bóng đá hôm nay chức năng cho kèo chấp bóng đá hôm nay trường hợp ít hơn, bình đẳng và lớn hơn. Những cái này phải được cung cấp, hoặc trình tối ưu hóa sẽ không thể có hiệu quả sử dụng chỉ mục.
Bước tiếp theo là thêm kèo chấp bóng đá hôm nay mục cho kèo chấp bóng đá hôm nay toán tử này vàopg_amopMối quan hệ. Để làm điều này, kèo chấp bóng đá hôm nay tôi sẽ cần TheoidS của kèo chấp bóng đá hôm 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ả kèo chấp bóng đá hôm nay toán tử mất haiphức tạpes và chọn ra của kèo chấp bóng đá hôm nay 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'; Opoid | tên oprname --------+--------- 277963 | + 277970 | < 277971 | <= 277972 | = 277973 | = 277974 | (6 hàng)(Một lần nữa, một số của bạnOIDSố gần như chắc chắn sẽ khác.) kèo chấp bóng đá hôm nay nhà khai thác chúng ta đang quan tâm đến những người cóOIDS 277970 thông qua 277974. kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay giá trị dưới đây. Chúng tôi sẽ làm điều này với câu lệnh select.
Bây giờ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay nhà khai thác được đặt hàng, từ ít hơn thông qua lớn hơn, trongpg_amop. Chúng tôi thêm kèo chấp bóng đá hôm nay trường hợp chúng ta cần:
Chèn vào pg_amop (amopid, amopclaid, amopop, amopstrargety) Chọn am.oid, opcl.oid, c.opoid, 1 Từ pg_am am, pg_opclass opcl, comple_ops_tmp c Nơi amname = 'btree' và opcname = 'Complex_abs_ops' và c.oprname = '<';Bây giờ hãy làm điều này cho kèo chấp bóng đá hôm nay toán tử khác thay thế cho "1" Trong dòng thứ ba ở trên và "<" trong dòng cuối cùng. Lưu ý kèo chấp bóng đá hôm nay Đặt hàng: "Ít 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 tiếp theo là đăng ký "thói quen hỗ trợ" được mô tả trước đây trong cuộc thảo luận của kèo chấp bóng đá hôm nay 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, kèo chấp bóng đá hôm nay ta cần đăng ký chức năng trongPostgres(Nhớ lại rằng kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay thói quen):
Tạo chức năng Complex_ABS_CMP (phức tạp, phức tạp) 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 đó roname = 'Complex_abs_cmp'; oid | TUYỆT VỜI --------+----------------- 277997 | Complex_ABS_CMP (1 hàng)(Một lần nữa, của bạnOIDsố sẽ Có lẽ là khác nhau.) kèo chấp bóng đá hôm nay ta có thể thêm thể hiện mới như sau:
22871_23167
Và chúng tôi đã xong! (Whew.) Bây giờ có thể tạo và Sử dụng kèo chấp bóng đá hôm nay chỉ mục Btree trênphức tạpcột.