Phiên bản không được hỗ trợ:7.0 / 6.5 / 6.4
Tài liệu này dành kèo bóng đá cúp c2 phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang kèo bóng đá cúp c2hiện tại4958_5039

Chương 37. kèo bóng đá cúp c2 tiện ích mở rộng giao thoa Cho kèo bóng đá cúp c2 chỉ số

kèo bóng đá cúp c2 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 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 bóng đá cúp c2 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à,6279_6319PG_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 bóng đá cúp c2 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ây6560_6649

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 kèo bóng đá cúp c2oPostgres, nhưng Mọi phương pháp truy cập khác được mô tả ở đây. Lược đồ là

Bảng 37-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ụ kèo bóng đá cúp c2 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 đá cúp c2 việc này Phương thức truy cập (xem bên dưới)
Amsupport Số lượng kèo bóng đá cúp c2 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 đá cúp c2 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 đá cúp c2 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 kèo bóng đá cúp c2pg_amđược sử dụng làm khóa ngoại trong rất nhiều kèo bóng đá cúp c2 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 kèo bóng đá cúp c2 đó amname = 'btree';

         +----+
         | oid |
         +----+
         | 403 |
         +----+
Chúng tôi sẽ sử dụng điều đóChọnkèo bóng đá cúp c2 AWHEREmệnh đề sau.

TheAmstrargetiesthuộc tính tồn tại Chuẩn hóa so sánh giữa kèo bóng đá cúp c2 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 bóng đá cúp c2 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 đá cúp c2 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, kèo bóng đá cúp c2 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 kèo bóng đá cúp c2 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-Tree. Postgressử dụng kèo bóng đá cúp c2 chiến lược để thể hiện những điều này mối quan hệ giữa kèo bóng đá cúp c2 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 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. kèo bóng đá cúp c2pg_amlớp, thuộc tính Amstrargeties là Số lượng chiến lược được xác định kèo bóng đá cúp c2 phương pháp truy cập này. VìB-câys, số này là 5. kèo bóng đá cúp c2 chiến lược tương ứng với

Bảng 37-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 đá cúp c2 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 đá cúp c2 chiến lược này kèo bóng đá cúp c2 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 đá cúp c2 chi tiết của việc thêm kèo bóng đá cúp c2 thủ tục; chỉ hiểu rằng phải có một tập hợp kèo bóng đá cúp c2 quy trình này choint2, int4, oid,và mọi dữ liệu khác Nhập kèo bóng đá cúp c2o đóB-câyCó thể vận hành.

Đôi khi, kèo bóng đá cúp c2 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 bóng đá cúp c2 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ây12557_12792

Để quản lý kèo bóng đá cúp c2 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 bóng đá cúp c2 thói quen hỗ trợ được sử dụng bởi một phương thức truy cập. VìB-cây13142_13309

Lưu ý:13356_13476

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 đá cúp c2 thủ tục cho ít hơn, ít bằng nhau, v.v. không xuất hiện trongpg_am. Tương tự,Amsupport13779_13893

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à loại mặc định với OID. kèo bóng đá cúp c2 pg_amop, mọiB-câyLớp toán tử có một bộ 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 một thể hiện 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 đá cúp c2 lớp khác.

14490_14958
Lưu ý rằng oid kèo bóng đá cúp c2 bạnPG_OPCLASSphiên bản sẽ khác! Đừng lo về điều này mặc dù. Chúng tôi sẽ nhận được số này từ hệ thống sau này chỉ Giống như chúng ta có oid của loại ở đây.

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 đá cúp c2 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 đá cúp c2 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 đá cúp c2 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

15796_15964phức tạp.choặcphức tạp.sourceĐối với kèo bóng đá cúp c2 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ó một kèo bóng đá cúp c2i điều quan trọng đang xảy ra dưới.

Đầu tiên, lưu ý rằng kèo bóng đá cúp c2 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 đá cúp c2 nhà khai thác này là đã được xác định choINT4dưới tên <, <=, =, =, và. kèo bóng đá cúp c2 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 đá cúp c2 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 đá cúp c2 toán tử trong17003_17013, nhưng chỉ khi người vận hành không đã được xác định cho kèo bóng đá cúp c2 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 đá cúp c2 nhà khai thác. Nếu bạn hiểu sai, quyền truy cập kèo bóng đá cúp c2 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 đá cúp c2 chức năng của toán tử trả về giá trị boolean. kèo bóng đá cúp c2 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 (Complex_abs, Complex_abs)
              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 đá cúp c2 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 đá cúp c2 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 một 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
     kèo bóng đá cúp c2 đó oprname ~ '^.. & $' :: text;

Để xem tên của bạn có được lấy cho kèo bóng đá cúp c2 loại bạn muốn không. kèo bóng đá cúp c2 Những điều quan trọng ở đây là thủ tục (đó làCkèo bóng đá cúp c2 chức năng được xác định ở trên) và hạn chế và Tham gia kèo bóng đá cúp c2 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 đá cúp c2 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 đá cúp c2 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_abs, Rightarg = Complex_abs,
     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 đá cúp c2 thuộc tính sau:

Bảng 37-3.pg_amproclược đồ

thuộc tính Mô tả
Amopid The20100_20105củapg_amphiên bản kèo bóng đá cúp c2 B-Tree (== 403, xem ở trên)
Amopclaid TheOIDcủaPG_OPCLASSphiên bản kèo bóng đá cúp c2Complex_abs_ops(== Bất cứ điều gì bạn có thay thế của17314, xem ở trên)
Amopopr TheOIDS của kèo bóng đá cúp c2 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í
kèo bóng đá cúp c2 chức năng chi phí được sử dụng bởi Trình tối ưu hóa truy vấn để quyết định có nên sử dụng một chỉ mục nhất định trong quét. May mắn thay, những điều này đã tồn tại. Hai chức năng chúng ta sẽ sử dụng làBtreesel, ước tính tính chọn lọc củaB-câyBtreenPage, ước tính số lượng trang A Tìm kiếm sẽ chạm kèo bóng đá cúp c2o cây.

Vì vậy, chúng ta cầnOIDS của kèo bóng đá cúp c2 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 đá cúp c2 nhà khai thác Lấy haiphức tạpES và chọn chúng tôi ngoài:

21573_22150
(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 bóng đá cúp c2 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 đá cúp c2 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 đá cúp c2 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ờ 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 đá cúp c2 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 đá cúp c2 trường hợp chúng ta cần:

Chèn kèo bóng đá cúp c2o pg_amop (amopid, amopclaid, amopop, amopstrargety,
                Amopselect, amopnpages) 
        Chọn am.oid, opcl.oid, c.opoid, 1,
                'Btreesel' :: RegProc, 'BtreenPage' :: RegProc
        Từ pg_am am, pg_opclass opcl, complex_abs_ops_tmp c
        Nơi amname = 'btree' và
            opcname = 'Complex_abs_ops' và
            c.oprname = '<';
23207_23458

Bước tiếp theo là đăng ký "thói quen hỗ trợ" được mô tả trước đây kèo bóng đá cúp c2 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ữ kèo bóng đá cúp c2pg_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 kèo bóng đá cúp c2Postgres(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 đá cúp c2 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
     kèo bóng đá cúp c2 đó roname = 'Complex_abs_cmp';

         +------+------------------+
         | oid | tuyên bố |
         +------+------------------+
         | 17328 | Complex_ABS_CMP |
         +------+-----------------+
(Một 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.) Chúng ta có thể thêm thể hiện mới như sau:
Chèn vào pg_amproc (giữa, amopclaid, amproc, amprocnum)
        Chọn a.oid, B.oid, c.oid, 1
            Từ pg_am a, pg_opclass B, pg_proc C
            kèo bóng đá cúp c2 đó a.amname = 'btree' và
                b.opcname = 'Complex_abs_ops' và
                c.proname = 'Complex_abs_cmp';

Bây giờ chúng ta cần thêm một chiến lược băm để kèo bóng đá cúp c2 phép loại lập chỉ mục. Chúng tôi làm điều này bằng cách sử dụng một loại khác trong PG_AM nhưng chúng tôi sử dụng lại Sames Ops.

Chèn kèo bóng đá cúp c2o pg_amop (amopid, amopclaid, amopop, amopstrargety,
                Amopselect, amopnpages)
        Chọn am.oid, opcl.oid, c.opoid, 1,
                'Hashsel' :: RegProc, 'Hashnpage' :: RegProc
        Từ pg_am am, pg_opclass opcl, complex_abs_ops_tmp c
        Nơi amname = 'băm' và
            opcname = 'Complex_abs_ops' và
            c.oprname = '=';

Để sử dụng chỉ mục này kèo bóng đá cúp c2 mệnh đề nơi, chúng ta cần sửa đổi Thepg_operatorlớp như sau.

Cập nhật pg_operator
        Đặt oprrest = 'eqsel' :: regproc, oprjoin = 'eqjoinsel'
        kèo bóng đá cúp c2 đó oprname = '=' và
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

    Cập nhật PG_Operator
        Đặt oprrest = 'neqsel' :: regproc, oprjoin = 'neqjoinsel'
        WHERE OPRNAME = '' VÀ
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

    Cập nhật PG_Operator
        Đặt oprrest = 'neqsel' :: regproc, oprjoin = 'neqjoinsel'
        WHERE OPRNAME = '' VÀ
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

    Cập nhật PG_Operator
        Đặt oprrest = 'intltsel' :: regproc, oprjoin = 'intltjoinsel'
        kèo bóng đá cúp c2 đó oprname = '<' và 
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

    Cập nhật PG_Operator
        Đặt oprrest = 'intltsel' :: regproc, oprjoin = 'intltjoinsel'
        kèo bóng đá cúp c2 đó oprname = '<=' và
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

    Cập nhật PG_Operator
        Đặt oprrest = 'intgtsel' :: regproc, oprjoin = 'intgtjoinsel'
        Nơi oprname = '' và
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

    Cập nhật PG_Operator
        Đặt oprrest = 'intgtsel' :: regproc, oprjoin = 'intgtjoinsel'
        kèo bóng đá cúp c2 đó oprname = ' =' và
            oprleft = oprright và
            oprleft = (chọn OID từ pg_type kèo bóng đá cúp c2 đó typname = 'complex_abs');

và cuối cùng (cuối cùng!) Chúng tôi đăng ký một mô tả về loại này.

Chèn vào pg_descrip (objoid, mô tả) 
    Chọn OID, 'Tài khoản hai phần G/L'
            Từ pg_type kèo bóng đá cúp c2 đó typname = 'comple_abs';