Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

64.2. Chỉ kèo bóng đá hom nay GIST#

64.2.1. Giới thiệu#

gistlà viết tắt của cây tìm kiếm tổng quát. Đây là một phương pháp truy cập có cấu trúc cây cân bằng, hoạt động như một mẫu cơ sở để thực hiện các sơ đồ lập chỉ kèo bóng đá hom nay tùy ý. B-cây, cây r và nhiều sơ đồ lập chỉ kèo bóng đá hom nay khác có thể được thực hiện trongGist.

kèo bóng đá hom nay lợi thế củaGistCó phải nó cho phép phát triển các loại dữ kèo bóng đá hom nay tùy chỉnh với các phương thức truy cập phù hợp, bởi một chuyên gia trong miền của kiểu dữ kèo bóng đá hom nay, thay vì chuyên gia cơ sở dữ kèo bóng đá hom nay.

Một số thông tin ở đây có nguồn gốc từ Đại học California tại Dự án lập chỉ kèo bóng đá hom nay GIST của BerkeleyTrang webvà Luận án của Marcel Kornacker,Phương thức truy cập cho các hệ thống cơ sở dữ kèo bóng đá hom nay thế hệ tiếp theo. Thegisttriển khai trongPostgreSQLchủ yếu được duy trì bởi Teodor Sigaev và Oleg Bartunov, và có nhiều thông tin hơn về của họTrang web.

64.2.2. kèo bóng đá hom nay lớp toán tử tích hợp#

CorePostgreSQLPhân phối bao gồmGistkèo bóng đá hom nay lớp toán tử hiển thị trongBảng 64.1. (kèo bóng đá hom nay số mô -đun tùy chọn được mô tả trongPhụ lục FCung cấp bổ sungGistkèo bóng đá hom nay lớp toán tử.)

Bảng 64.1. Tích hợpGistkèo bóng đá hom nay lớp toán tử

tên Các toán tử có thể lập chỉ kèo bóng đá hom nay kèo bóng đá hom nay toán tử đặt hàng
Box_ops << (hộp, hộp) <- (hộp, điểm)
& <(hộp, hộp)
&& (hộp, hộp)
& (hộp, hộp)
(hộp, hộp)
~ = (hộp, hộp)
@ (hộp, hộp)
<@ (hộp, hộp)
& <| (hộp, hộp)
<< | (hộp, hộp)
| (hộp, hộp)
| & (hộp, hộp)
Circle_ops << (Circle, Circle) <- (vòng tròn, điểm)
& <(vòng tròn, vòng tròn)
& (vòng tròn, vòng tròn)
(vòng tròn, vòng tròn)
<@ (vòng tròn, vòng tròn)
@ (vòng tròn, vòng tròn)
~ = (vòng tròn, vòng tròn)
&& (vòng tròn, vòng tròn)
| (vòng tròn, vòng tròn)
<< | (vòng tròn, vòng tròn)
& <| (vòng tròn, vòng tròn)
| & (vòng tròn, vòng tròn)
inet_ops << (inet, inet)
<< = (inet, inet)
(inet, inet)
= (inet, inet)
= (inet, inet)
< (inet, inet)
<(inet, inet)
17952_17972
(inet, inet)
= (inet, inet)
&& (inet, inet)
Multirange_ops = (Anymultirange, Anymultirange)
&& (Anymultirange, Anymultirange)
&& (Anymultirange, Anyrange)
@ (Anymultirange, AnyEuity)
@ (Anymultirange, Anymultirange)
@ (Anymultirange, Anyrange)
<@ (Anymultirange, Anymultirange)
<@ (Anymultirange, Anyrange)
<< (Anymultirange, Anymultirange)
<< (Anymultirange, Anyrange)
(Anymultirange, Anymultirange)
(Anymultirange, Anyrange)
& <(Anymultirange, Anymultirange)
& <(Anymultirange, Anyrange)
& (Anymultirange, Anymultirange)
& (Anymultirange, Anyrange)
- |- (Anymultirange, Anymultirange)
- |- (Anymultirange, Anyrange)
point_ops | (điểm, điểm) <- (điểm, điểm)
<< (điểm, điểm)
(điểm, điểm)
<< | (điểm, điểm)
~ = (điểm, điểm)
<@ (điểm, hộp)
<@ (điểm, polygon)
<@ (điểm, vòng tròn)
poly_ops << (Polygon, Polygon) <- (Polygon, Point)
& <(đa giác, đa giác)
& (đa giác, đa giác)
(đa giác, đa giác)
<@ (Polygon, Polygon)
@ (đa giác, đa giác)
~ = (Polygon, Polygon)
&& (đa giác, đa giác)
<< | (đa giác, đa giác)
& <| (đa giác, đa giác)
| & (đa giác, đa giác)
| (đa giác, đa giác)
Range_ops = (Anyrange, Anyrange)
&& (Anyrange, Anyrange)
&& (Anyrange, Anymultirange)
@ (Anyrange, AnyEuity)
@ (Anyrange, Anyrange)
@ (Anyrange, Anymultirange)
<@ (Anyrange, Anyrange)
<@ (Anyrange, Anymultirange)
<< (Anyrange, Anyrange)
<< (Anyrange, Anymultirange)
(Anyrange, Anyrange)
(Anyrange, Anymultirange)
& <(Anyrange, Anyrange)
& <(Anyrange, Anymultirange)
& (Anyrange, Anyrange)
& (Anyrange, Anymultirange)
- |- (Anyrange, Anyrange)
- |- (Anyrange, Anymultirange)
tsquery_ops <@ (tsquery, tsquery)
@ (tsquery, tsquery)
tsVector_ops @@ (TSVector, Tsquery)

Vì lý do lịch sử,inet_ops26371_26424inetCIDR. Để sử dụng nó, hãy đề cập đến tên lớp trongTạo chỉ kèo bóng đá hom nay, ví dụ

Tạo chỉ kèo bóng đá hom nay trên my_table bằng Gist (my_inet_column inet_ops);

64.2.3. Khả năng mở rộng#

Theo truyền thống, việc thực hiện một phương thức truy cập chỉ kèo bóng đá hom nay mới có nghĩa là rất nhiều công việc khó khăn. Cần phải hiểu các hoạt động bên trong của cơ sở dữ liệu, chẳng hạn như trình quản lý khóa và nhật ký ghi. TheGISTGiao diện có mức độ trừu tượng cao, yêu cầu người thực hiện phương thức truy cập chỉ để thực hiện ngữ nghĩa của kiểu dữ kèo bóng đá hom nay được truy cập. TheGISTBản thân lớp chăm sóc sự đồng thời, ghi nhật ký và tìm kiếm cấu trúc cây.

27482_27635PostgreSQLHỗ trợ các chỉ kèo bóng đá hom nay B và chỉ số băm có thể mở rộng. Điều đó có nghĩa là bạn có thể sử dụngPOSTGRESQLĐể xây dựng một cây b hoặc băm trên bất kỳ loại dữ kèo bóng đá hom nay nào bạn muốn. Nhưng B-cây chỉ hỗ trợ các vị từ phạm vi (<, =, ) và chỉ các chỉ kèo bóng đá hom nay băm chỉ hỗ trợ các truy vấn bình đẳng.

Vì vậy, nếu bạn lập chỉ kèo bóng đá hom nay, hãy nói, một bộ sưu tập hình ảnh cóPostgreSQLB-tree, bạn chỉ có thể phát hành kèo bóng đá hom nay truy vấn nhưIS IS ISTIVHàng, IS IS ISTIVE28402_28433. Tùy thuộc vào cách bạn xác địnhHồibằngHồi, ít hơnlớn hơnHồiTrong bối cảnh này, điều này có thể hữu ích. Tuy nhiên, bằng cách sử dụngGistChỉ kèo bóng đá hom nay dựa trên, bạn có thể tạo các cách để hỏi các câu hỏi cụ thể về tên miền, có lẽTìm tất cả hình ảnh của ngựaVoihoặcTìm tất cả kèo bóng đá hom nay hình ảnh tiếp xúc quá mức.

Tất cả những gì cần thiết để có đượcGISTPhương thức truy cập lên và chạy là thực hiện một số phương thức do người dùng xác định, xác định hành vi của kèo bóng đá hom nay khóa trong cây. Tất nhiên, kèo bóng đá hom nay phương pháp này phải khá lạ mắt để hỗ trợ kèo bóng đá hom nay truy vấn ưa thích, nhưng đối với tất cả kèo bóng đá hom nay truy vấn tiêu chuẩn (B-cây, cây R, v.v.), chúng tương đối đơn giản. Tóm lại,Gist29438_29521

Có năm phương thức mà một lớp toán tử chỉ kèo bóng đá hom nay choGistphải cung cấp và sáu là tùy chọn. Tính chính xác của chỉ kèo bóng đá hom nay được đảm bảo bằng cách thực hiện đúngcùng, nhất quánUnionPhương pháp, trong khi hiệu quả (kích thước và tốc độ) của chỉ kèo bóng đá hom nay sẽ phụ thuộc vàohình phạtPickSplitPhương pháp. Hai phương thức tùy chọn lànéngiải nén, cho phép một chỉ kèo bóng đá hom nay có dữ liệu cây bên trong thuộc loại khác với dữ liệu mà nó chỉ kèo bóng đá hom nay. Lá phải thuộc loại dữ liệu được lập chỉ kèo bóng đá hom nay, trong khi các nút cây khác có thể thuộc bất kỳ cấu trúc C nào (nhưng bạn vẫn phải theo dõiPostgreSQLQuy tắc kiểu dữ kèo bóng đá hom nay ở đây, xem vềVarlenacho dữ kèo bóng đá hom nay có kích thước biến). Nếu kiểu dữ kèo bóng đá hom nay nội bộ của cây tồn tại ở cấp SQL, thìlưu trữTùy chọn củaTạo lớp toán tửCó thể sử dụng lệnh. Phương thức thứ tám tùy chọn làKhoảng cách, cần thiết nếu lớp toán tử muốn hỗ trợ quét theo thứ tự (tìm kiếm lân cận gần nhất). Phương pháp thứ chín tùy chọnFetchlà cần thiết nếu lớp toán tử muốn hỗ trợ các lần quét chỉ chỉ kèo bóng đá hom nay, ngoại trừ khinénPhương pháp bị bỏ qua. Phương pháp thứ mười tùy chọnTùy chọnlà cần thiết nếu lớp toán tử có tham số do người dùng chỉ định. Phương pháp thứ mười kèo bóng đá hom nay tùy chọnSortsupportđược sử dụng để tăng tốc xây dựng AGistindex.

31444_31456

Đã cho kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nayP31551_31572Q, Hàm này xác định xem kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay có phải lànhất quánvới truy vấn; nghĩa là, có thể là vị ngữinstioned_column Indexable_operator QTrue cho bất kỳ hàng nào được biểu thị bằng kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay? Đối với một kèo bóng đá hom nay nhập chỉ số lá, điều này tương đương với việc kiểm tra điều kiện có thể lập chỉ kèo bóng đá hom nay, trong khi đối với một nút cây bên trong, bạn có cần thiết phải quét cây con của chỉ số được biểu thị bằng nút cây hay không. Khi kết quả làTRUE, ARecheckCờ cũng phải được trả về. Điều này cho biết kèo bóng đá hom nay vị ngữ chắc chắn là đúng hay chỉ có thể đúng. Nếu nhưRecheck=falseSau đó, chỉ kèo bóng đá hom nay đã kiểm tra chính xác điều kiện vị ngữ, trong khi nếuRecheck=TRUE32654_32748Indexable_operatorso với giá trị hàng thực tế để xem nó có thực sự là kèo bóng đá hom nay trận đấu hay không. Quy ước này cho phépGistĐể hỗ trợ cả cấu trúc chỉ số không mất và mất.

TheSQL33043_33094

Tạo hoặc thay thế hàm my_consistent (nội bộ, data_type, smallint, oid, nội bộ)
Trả lại bool
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Và mã phù hợp trong mô -đun C sau đó có thể theo bộ xương này:

33409_34276

ở đây,Keylà một yếu tố trong chỉ kèo bóng đá hom nay vàTruy vấn34398_34445StrategyNumberTham số cho biết toán tử nào của lớp toán tử của bạn đang được áp dụng - Nó phù hợp với một trong kèo bóng đá hom nay số toán tử trongTạo lớp toán tửlệnh.

Tùy thuộc vào toán tử bạn đã đưa vào lớp, kiểu dữ kèo bóng đá hom nay củaTruy vấncó thể thay đổi theo toán tử, vì nó sẽ là bất kỳ loại nào ở phía bên phải của toán tử, có thể khác với loại dữ liệu được lập chỉ kèo bóng đá hom nay xuất hiện ở phía bên trái. (Bộ xương mã trên giả định rằng chỉ có một loại có thể; nếu không, tìm nạpTruy vấnGiá trị đối số sẽ phải phụ thuộc vào toán tử.)nhất quánHàm sử dụng kiểu dữ liệu được lập chỉ kèo bóng đá hom nay của OPClass choTruy vấnĐối số, mặc dù loại thực tế có thể là thứ khác tùy thuộc vào toán tử.

Union

Phương pháp này củng cố thông tin trong cây. Cho một tập hợp các kèo bóng đá hom nay, chức năng này tạo ra một kèo bóng đá hom nay chỉ kèo bóng đá hom nay mới đại diện cho tất cả các kèo bóng đá hom nay đã cho.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_union (nội bộ, nội bộ)
Trả về Storage_Type
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Và mã phù hợp trong mô -đun C sau đó có thể theo bộ xương này:

pg_function_info_v1 (my_union);

Mốc thời gian
my_union (pg_function_args)

    GistEntryVector *entryVec = (gistEntryVector *) pg_getarg_pulum (0);
    GistEntry *ent = entryVec- vector;
    data_type *out,
               *TMP,
               *cũ;
    int numranges,
                i = 0;

    numRanges = entryVec- n;
    tmp = datumgetDatateType (ent [0] .Key);
    ra = tmp;

    if (numRanges == 1)

        out = data_type_deep_copy (TMP);

        Pg_return_data_type_p (ra);

    for (i = 1; i <numranges; i ++)

        cũ = ra;
        tmp = datumgetDatateType (ent [i] .key);
        ra = my_union_implementation (ra, tmp);

    Pg_return_data_type_p (ra);

Như bạn có thể thấy, trong bộ xương này, chúng tôi đang xử lý một kiểu dữ kèo bóng đá hom nay trong đóUnion (X, Y, Z) = Union (Union (X, Y), Z)36968_37090GistPhương pháp hỗ trợ.

Kết quả củaLiên minhHàm phải là giá trị của loại lưu trữ của chỉ kèo bóng đá hom nay, bất cứ điều gì (nó có thể hoặc không khác với loại cột được lập chỉ kèo bóng đá hom nay). TheUnionHàm sẽ trả kèo bóng đá hom nay con trỏ mớipalloc ()Bộ nhớ ED. Bạn không thể trả về giá trị đầu vào as-is, ngay cả khi không có loại thay đổi.

Như được hiển thị ở trên,UnionFirst FirstNội bộĐối số thực sự là kèo bóng đá hom naygistEntryVectorCon trỏ. Đối số thứ hai là kèo bóng đá hom nay con trỏ tới kèo bóng đá hom nay biến số nguyên, có thể bị bỏ qua. (Nó đã từng được yêu cầu rằngUnionHàm lưu trữ kích thước của giá trị kết quả của nó vào biến đó, nhưng điều này không còn cần thiết nữa.)

nén

Chuyển đổi kèo bóng đá hom nay dữ liệu thành một định dạng phù hợp để lưu trữ vật lý trong trang chỉ kèo bóng đá hom nay. NếunénPhương pháp bị bỏ qua, các kèo bóng đá hom nay dữ liệu được lưu trữ trong chỉ kèo bóng đá hom nay mà không cần sửa đổi.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_compress (nội bộ)
Trả lại nội bộ
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Và mã phù hợp trong mô -đun C sau đó có thể theo dõi bộ xương này:

pg_function_info_v1 (my_compress);

Mốc thời gian
my_compress (pg_function_args)

    GistEntry *entry = (gistEntry *) pg_getarg_pulum (0);
    Gistentry *retval;

    Nếu (Entry- LeafKey)

        / * Thay thế Entry- phím bằng phiên bản nén */
        nén_data_type *nén_data = palloC (sizeof (nén_data_type));

        / *điền *nén_data từ Entry- Key ... *//

        retval = palloc (sizeof (gistentry));
        gistentryinit (*retval, pulongetdatum (nén_data),
                      Entry- rel, Entry- Page, Entry- Offset, False);

    khác

        / * Thông thường chúng ta không cần làm bất cứ điều gì với các kèo bóng đá hom nay không lá */
        retval = kèo bóng đá hom nay nhập;

    Pg_return_pulum (retval);

Bạn phải điều chỉnhnén_data_typesang loại cụ thể mà bạn chuyển đổi thành để nén kèo bóng đá hom nay nút lá của bạn, tất nhiên.

giải nén

Chuyển đổi biểu diễn được lưu trữ của một kèo bóng đá hom nay dữ liệu thành một định dạng có thể được thao tác bởi các phương thức GIST khác trong lớp toán tử. Nếugiải nénPhương thức bị bỏ qua, người ta cho rằng các phương thức GIST khác có thể hoạt động trực tiếp trên định dạng dữ kèo bóng đá hom nay được lưu trữ. (giải nénkhông nhất thiết là mặt trái củanénPhương pháp; Cụ thể, nếunénlà mất thì không thể chogiải nénĐể xây dựng lại chính xác dữ kèo bóng đá hom nay gốc.giải nénkhông nhất thiết tương đương vớiFetch, vì các phương thức GIST khác có thể không yêu cầu tái cấu trúc dữ kèo bóng đá hom nay đầy đủ.)

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_decompress (nội bộ)
Trả lại nội bộ
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Và mã phù hợp trong mô -đun C sau đó có thể theo dõi bộ xương này:

pg_function_info_v1 (my_decompress);

Mốc thời gian
my_decompress (pg_function_args)

    Pg_return_pulum (pg_getarg_pulum (0));

Bộ xương trên phù hợp cho trường hợp không cần giải nén. (Nhưng, tất nhiên, việc bỏ qua phương pháp hoàn toàn thậm chí còn dễ dàng hơn và được khuyến nghị trong những trường hợp như vậy.)

hình phạt

Trả về giá trị biểu thịchi phí41515_41518của việc chèn kèo bóng đá hom nay mới vào một nhánh cụ thể của cây. Các kèo bóng đá hom nay sẽ được chèn xuống đường dẫn ít nhấthình phạt41672_4170741728_41737nên không âm. Nếu kèo bóng đá hom nay giá trị âm được trả về, nó sẽ được coi là 0.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_penalty (nội bộ, nội bộ, nội bộ)
Trả lại nội bộ
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;  - Trong một số trường hợp, kèo bóng đá hom nay chức năng hình phạt không cần phải nghiêm ngặt

Và mã phù hợp trong mô -đun C sau đó có thể theo bộ xương này:

pg_function_info_v1 (my_penalty);

Mốc thời gian
my_penalty (pg_function_args)

    GistEntry *origentry = (gistEntry *) pg_getarg_pulum (0);
    GistEntry *newEntry = (gistEntry *) pg_getarg_pulum (1);
    phao *hình phạt = (float *) pg_getarg_pulum (2);
    data_type *orig = datumgetDatateType (origentry- key);
    data_type *new = datumgetDatateType (key- key);

    *hình phạt = my_penalty_implementation (orig, mới);
    Pg_return_pulum (hình phạt);

Vì lý do lịch sử,hình phạtHàm không chỉ trả vềfloatKết quả; Thay vào đó, nó phải lưu trữ giá trị tại vị trí được biểu thị bằng đối số thứ ba. Giá trị trả về mỗi se bị bỏ qua, mặc dù thông thường để chuyển lại địa chỉ của đối số đó.

Thehình phạtHàm rất quan trọng đối với hiệu suất tốt của chỉ kèo bóng đá hom nay. Nó sẽ được sử dụng vào thời gian chèn để xác định chi nhánh nào sẽ làm theo khi chọn nơi thêm kèo bóng đá hom nay nhập mới vào cây. Vào thời điểm truy vấn, chỉ kèo bóng đá hom nay càng cân bằng, tra cứu càng nhanh.

PickSplit

43531_43687

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_picksplit (nội bộ, nội bộ)
Trả lại nội bộ
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Và mã phù hợp trong mô -đun C sau đó có thể theo dõi bộ xương này:

44088_46220

Lưu ý rằngPickSplitKết quả của chức năng được phân phối bằng cách sửa đổi thông quaVCấu trúc. Giá trị trả về mỗi se bị bỏ qua, mặc dù thông thường để truyền lại địa chỉ củaV.

nhưhình phạt, ThePickSplitHàm rất quan trọng đối với hiệu suất tốt của chỉ kèo bóng đá hom nay. Thiết kế phù hợphình phạtPickSplittriển khai là nơi thách thức thực hiện hoạt động tốtGISTLIES LIES.

cùng

47028_47100Mạnhkèo bóng đá hom nay nhập chỉ kèo bóng đá hom naylà giá trị của loại lưu trữ của chỉ kèo bóng đá hom nay, không nhất thiết là loại cột được lập chỉ kèo bóng đá hom nay gốc.)

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_same (Storage_Type, Storage_Type, Internal)
Trả lại nội bộ
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

và mã phù hợp trong mô -đun C sau đó có thể theo bộ xương này:

pg_function_info_v1 (my_same);

Mốc thời gian
my_same (pg_function_args)

    prefix_range *v1 = pg_getarg_prefix_range_p (0);
    prefix_range *v2 = pg_getarg_prefix_range_p (1);
    bool *result = (bool *) pg_getarg_pulum (2);

    *result = my_eq (v1, v2);
    Pg_return_pulum (result);

Vì lý do lịch sử,cùngHàm không chỉ trả về kết quả boolean; Thay vào đó, nó phải lưu trữ cờ tại vị trí được biểu thị bằng đối số thứ ba. Giá trị trả về mỗi se bị bỏ qua, mặc dù thông thường để chuyển lại địa chỉ của đối số đó.

Khoảng cách

Cho kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nayPvà giá trị truy vấnq, Hàm này xác định kèo bóng đá hom nay nhập của kèo bóng đá hom nay nhậpKhoảng cáchKhănTừ giá trị truy vấn. Hàm này phải được cung cấp nếu lớp toán tử chứa bất kỳ toán tử đặt hàng nào. Truy vấn sử dụng toán tử đặt hàng sẽ được triển khai bằng cách trả về các kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay với nhỏ nhấtKhoảng cáchĐầu tiên, vì vậy kết quả phải phù hợp với ngữ nghĩa của nhà điều hành. Đối với kèo bóng đá hom nay nhập chỉ số lá, kết quả chỉ thể hiện khoảng cách đến kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay; Đối với một nút cây bên trong, kết quả phải là khoảng cách nhỏ nhất mà bất kỳ kèo bóng đá hom nay nhập con nào cũng có thể có.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_distance (nội bộ, data_type, smallint, oid, nội bộ)
Trả lại float8
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

và mã phù hợp trong mô -đun C sau đó có thể theo bộ xương này:

pg_function_info_v1 (my_distance);

Mốc thời gian
my_distance (pg_function_args)

    GistEntry *entry = (gistEntry *) pg_getarg_pulum (0);
    data_type *truy vấn = pg_getarg_data_type_p (1);
    Chiến lược chiến lược = (StrategyNumber) PG_GetArg_Uint16 (2);
    /* Oid phân nhóm = pg_getarg_oid ​​(3); */
    / *bool *RecHeck = (bool *) pg_getarg_pulum (4); */
    data_type *key = datumGetDatatype (entry- key);
    gấp đôi retval;

    /*
     * Xác định giá trị trả về là kèo bóng đá hom nay hàm của chiến lược, khóa và truy vấn.
     */

    Pg_return_float8 (retval);

kèo bóng đá hom nay đối số choKhoảng cáchHàm giống hệt với kèo bóng đá hom nay đối số củanhất quánchức năng.

Một số xấp xỉ được cho phép khi xác định khoảng cách, miễn là kết quả không bao giờ lớn hơn khoảng cách thực tế của kèo bóng đá hom nay. Do đó, ví dụ, khoảng cách đến một hộp giới hạn thường là đủ trong các ứng dụng hình học. Đối với một nút cây bên trong, khoảng cách được trả về không được lớn hơn khoảng cách đến bất kỳ nút con nào. Nếu khoảng cách trả về không chính xác, hàm phải đặt*REMHECKĐúng. .

Nếu hàm khoảng cách trả về*Recheck = trueĐối với bất kỳ nút lá nào, loại trả về của toán tử đặt hàng ban đầu phải làfloat8hoặcfloat4và kèo bóng đá hom nay giá trị kết quả của hàm khoảng cách phải tương đương với kèo bóng đá hom nay giá trị của toán tử đặt hàng ban đầu, vì người thực thi sẽ sắp xếp bằng cả kết quả chức năng khoảng cách và kết quả điều hành đặt hàng được tính toán lại. Nếu không, kèo bóng đá hom nay giá trị kết quả của hàm khoảng cách có thể là bất kỳ hữu hạnfloat8Giá trị, miễn là thứ tự tương đối của kèo bóng đá hom nay giá trị kết quả khớp với thứ tự được trả về bởi toán tử đặt hàng. (Vô cực và trừ vô cực được sử dụng bên trong để xử lý kèo bóng đá hom nay trường hợp như nulls, do đóKhoảng cáchHàm trả về kèo bóng đá hom nay giá trị này.)

Fetch

Chuyển đổi biểu diễn chỉ kèo bóng đá hom nay nén của kèo bóng đá hom nay dữ liệu thành kiểu dữ liệu gốc, để quét chỉ có chỉ kèo bóng đá hom nay. Dữ liệu được trả về phải là một bản sao chính xác, không bị mất của giá trị được lập chỉ kèo bóng đá hom nay ban đầu.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_fetch (nội bộ)
Trả lại nội bộ
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

​​Đối số là kèo bóng đá hom nay con trỏ tớigistEntryCấu trúc. Khi nhập cảnh, nóKeyTrường chứa một mốc dữ kèo bóng đá hom nay lá không null ở dạng nén. Giá trị trả về là một giá trị khácgistentrystruct, cóKeyTrường chứa cùng một mốc trong dạng ban đầu, không nén. Nếu chức năng nén của OPClass không làm gì cho các kèo bóng đá hom nay lá, thìFetch52941_53040FetchPhương thức cũng có thể được bỏ qua, vì nó nhất thiết phải là không có op.

Mã phù hợp trong mô -đun C sau đó có thể tuân theo bộ xương này:

pg_function_info_v1 (my_fetch);

Mốc thời gian
my_fetch (pg_function_args)

    GistEntry *entry = (gistEntry *) pg_getarg_pulum (0);
    input_data_type *in = datumGetPulum (entry- khóa);
    fetched_data_type *fetched_data;
    Gistentry *retval;

    retval = palloc (sizeof (gistentry));
    fetched_data = palloC (sizeof (fetched_data_type));

    /*
     * Chuyển đổi 'fetched_data' thành một mốc của kiểu dữ kèo bóng đá hom nay gốc.
     */

    / * điền * retval từ fetched_data. */
    gistentryinit (*retval, pulongetdatum (coltred_datum),
                  Entry- rel, Entry- Page, Entry- Offset, False);

    Pg_return_pulum (retval);

Nếu phương thức nén bị mất cho các kèo bóng đá hom nay nhập lá, lớp toán tử không thể hỗ trợ các lần quét chỉ có chỉ kèo bóng đá hom nay và không được xác địnhFetchchức năng.

Tùy chọn

Cho phép định nghĩa kèo bóng đá hom nay tham số có thể nhìn thấy người dùng điều khiển hành vi của lớp toán tử.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_options (nội bộ)
Trả về khoảng trống
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Hàm được chuyển kèo bóng đá hom nay con trỏ cho kèo bóng đá hom nay54648_54663struct, cần được lấp đầy với một tập hợp kèo bóng đá hom nay tùy chọn cụ thể của lớp vận hành. kèo bóng đá hom nay tùy chọn có thể được truy cập từ kèo bóng đá hom nay chức năng hỗ trợ khác bằng cách sử dụngPG_HAS_OPCLASS_OPTES ()PG_GET_OPCLASS_OPTES ()Macros.

Một ví dụ triển khai my_options () và kèo bóng đá hom nay tham số sử dụng từ kèo bóng đá hom nay chức năng hỗ trợ khác được đưa ra dưới đây:

55102_58453

Kể từ khi biểu diễn khóa trongGISTlà linh hoạt, nó có thể phụ thuộc vào kèo bóng đá hom nay tham số do người dùng chỉ định. Ví dụ, độ dài của chữ ký khóa có thể được chỉ định. Nhìn thấygtsVector_options ()Ví dụ.

Sortsupport

Trả về hàm so sánh để sắp xếp dữ kèo bóng đá hom nay theo cách bảo tồn địa phương. Nó được sử dụng bởiTạo chỉ kèo bóng đá hom nayReindexlệnh. Chất lượng của chỉ kèo bóng đá hom nay được tạo phụ thuộc vào mức độ sắp xếp được xác định bởi hàm so sánh bảo tồn địa phương của các đầu vào.

TheSortsupportPhương pháp là tùy chọn. Nếu nó không được cung cấp,Tạo chỉ kèo bóng đá hom nayXây dựng chỉ kèo bóng đá hom nay bằng cách chèn mỗi tuple vào cây bằng cách sử dụnghình phạtPickSplitChức năng, chậm hơn nhiều.

TheSQLTuyên bố chức năng phải trông như thế này:

Tạo hoặc thay thế hàm my_sortsupport (nội bộ)
Trả về khoảng trống
Như 'module_pathname'
Ngôn ngữ C nghiêm ngặt;

Đối số là kèo bóng đá hom nay con trỏ tớiSortsupportCấu trúc. Ở mức tối thiểu, chức năng phải điền vào trường so sánh của nó. Bộ so sánh có ba đối số: hai mốc dữ kèo bóng đá hom nay để so sánh và một con trỏ tớiSortsupportCấu trúc. Các mốc dữ liệu là hai giá trị được lập chỉ kèo bóng đá hom nay trong định dạng mà chúng được lưu trữ trong chỉ kèo bóng đá hom nay; nghĩa là, ở định dạng được trả về bởinén60232_60270SRC/bao gồm/Utils/Sortsupport.h.

Mã phù hợp trong mô -đun C sau đó có thể tuân theo bộ xương này:

pg_function_info_v1 (my_sortsupport);

Tĩnh int
my_fastcmp (datum x, datum y, sortSupport SSUP)

  / * Thiết lập thứ tự giữa x và y bằng cách tính toán kèo bóng đá hom nay số giá trị sắp xếp z */

  int z1 = computespatialCode (x);
  int z2 = computespatialCode (y);

  Trả về Z1 == Z2? 0: Z1 Z2? 1: -1;

Mốc thời gian
my_sortsupport (pg_function_args)

  Sắp xếp SSUP = (SortSupport) PG_GetArg_Pulum (0);

  ssup- so sánh = my_fastcmp;
  Pg_return_void ();

Tất cả kèo bóng đá hom nay phương thức hỗ trợ GIST thường được gọi trong bối cảnh bộ nhớ ngắn; đó là,currentMemoryContextsẽ được đặt lại sau mỗi lần xử lý. Do đó, không phải là rất quan trọng để lo lắng về việc mọi thứ bạn palloc. Tuy nhiên, trong một số trường hợp, nó hữu ích cho một phương thức hỗ trợ để lưu trữ dữ kèo bóng đá hom nay qua các cuộc gọi được lặp lại. Để làm điều đó, phân bổ dữ kèo bóng đá hom nay tồn tại lâu hơn trongfcinfo- flinfo- fn_mcxt, và giữ kèo bóng đá hom nay con trỏ cho nó trongfcinfo- flinfo- fn_extra. Dữ liệu đó sẽ tồn tại cho tuổi thọ của hoạt động chỉ kèo bóng đá hom nay (ví dụ: một lần quét chỉ kèo bóng đá hom nay GIST duy nhất, xây dựng chỉ kèo bóng đá hom nay hoặc chèn tăng chỉ số). Hãy cẩn thận với giá trị trước đó khi thay thếfn_extra61738_61810

64.2.4. Triển khai#

64.2.4.1. Phương thức xây dựng chỉ kèo bóng đá hom nay GIST#

Cách đơn giản nhất để xây dựng một chỉ kèo bóng đá hom nay GIST chỉ là để chèn tất cả các kèo bóng đá hom nay, từng người một. Điều này có xu hướng chậm đối với các chỉ kèo bóng đá hom nay lớn, bởi vì nếu các tổng chỉ kèo bóng đá hom nay nằm rải rác trên chỉ kèo bóng đá hom nay và chỉ kèo bóng đá hom nay đủ lớn để không phù hợp với bộ đệm, sẽ cần rất nhiều I/O ngẫu nhiên.PostgreSQLHỗ trợ hai phương pháp thay thế cho bản dựng ban đầu của chỉ kèo bóng đá hom nay GIST:Sắp xếpBufferedchế độ.

Phương thức được sắp xếp chỉ khả dụng nếu mỗi OPClass được sử dụng bởi Chỉ kèo bóng đá hom nay cung cấp mộtSortsupportHàm, như được mô tả trongPhần 64.2.3. Nếu họ làm như vậy, phương pháp này thường là tốt nhất, vì vậy nó được sử dụng theo mặc định.

Phương pháp đệm hoạt động bằng cách không chèn các bộ dữ liệu trực tiếp vào chỉ kèo bóng đá hom nay ngay lập tức. Nó có thể giảm đáng kể lượng I/O ngẫu nhiên cần thiết cho các bộ dữ liệu không được đặt hàng. Đối với các tập dữ liệu được đặt hàng tốt, lợi ích nhỏ hơn hoặc không tồn tại, bởi vì chỉ có một số lượng nhỏ các trang nhận được các bộ dữ liệu mới tại một thời điểm và các trang đó phù hợp với bộ đệm ngay cả khi toàn bộ chỉ kèo bóng đá hom nay không.

Phương thức được đệm cần gọihình phạt63664_64069

Nếu không thể sắp xếp, thì theo mặc định, bản dựng chỉ kèo bóng đá hom nay GIST chuyển sang phương thức đệm khi kích thước chỉ kèo bóng đá hom nay đạt đếnhiệu quả_cache_size. Bộ đệm có thể bị buộc hoặc ngăn chặn bằng tay bởibộ đệmTham số cho lệnh tạo chỉ kèo bóng đá hom nay. Hành vi mặc định là tốt cho hầu hết các trường hợp, nhưng tắt bộ đệm có thể tăng tốc độ xây dựng nếu dữ liệu đầu vào được đặt hàng.

64.2.5. Ví dụ#

ThePostgreSQLPhân phối nguồn bao gồm một số ví dụ về các phương thức chỉ kèo bóng đá hom nay được triển khai bằng cách sử dụngGIST. Hệ thống cốt lõi hiện cung cấp hỗ trợ tìm kiếm văn bản (lập chỉ kèo bóng đá hom nay chotsVectortsquery) cũng như chức năng tương đương r-tree cho một số loại dữ kèo bóng đá hom nay hình học tích hợp (xemsrc/phụ trợ/truy cập/gist/gistproc.c). SauĐóng gópMô -đun cũng chứagist65424_65444

btree_gist

65620_65676

khối

lập chỉ kèo bóng đá hom nay cho các khối đa chiều

Hstore

Mô -đun để lưu trữ (khóa, giá trị) cặp

intarray

66121_66171

Ltree

lập chỉ kèo bóng đá hom nay cho các cấu trúc giống như cây

PG_TRGM

Sự tương đồng về văn bản bằng cách sử dụng Trigram khớp

SEG

lập chỉ kèo bóng đá hom nay choPhạm vi nổi

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài kèo bóng đá hom nay không chính xác, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài kèo bóng đá hom nay.