Phiên bản được hỗ trợ:hiện tại(17)16 / 15 / 14 / 13
Phiên bản phát triển:Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

64.3.kèo chấp bóng đá hôm nay Indexes#

64.3.1.Giới thiệu#

kèo chấp bóng đá hôm naylà viết tắt của không gian phân vùnggist. kèo chấp bóng đá hôm nayHỗ trợ kèo chấp bóng đá hôm nay cây tìm kiếm được phân vùng, tạo điều kiện cho việc phát triển một loạt kèo chấp bóng đá hôm nay cấu trúc dữ liệu không cân bằng khác nhau, như cây tứ giác, cây K-D và cây radix (thử). Đặc điểm chung của kèo chấp bóng đá hôm nay cấu trúc này là chúng liên tục chia không gian tìm kiếm thành kèo chấp bóng đá hôm nay phân vùng không cần phải có kích thước bằng nhau.

kèo chấp bóng đá hôm nay cấu trúc dữ liệu phổ biến này ban đầu được phát triển để sử dụng trong bộ nhớ. Trong bộ nhớ chính, chúng thường được thiết kế như một tập hợp kèo chấp bóng đá hôm nay nút được phân bổ động được liên kết bởi kèo chấp bóng đá hôm nay con trỏ.kèo chấp bóng đá hôm naylà ánh xạ kèo chấp bóng đá hôm nay nút cây tìm kiếm đến kèo chấp bóng đá hôm nay trang đĩa theo cách mà tìm kiếm chỉ cần truy cập một vài trang đĩa, ngay cả khi nó đi qua nhiều nút.

nhưgist, kèo chấp bóng đá hôm naycó nghĩa là cho phép phát triển kèo chấp bóng đá hôm nay loại dữ liệu tùy chỉnh với kèo chấp bóng đá hôm nay phương thức truy cập phù hợp, bởi một chuyên gia trong lĩnh vực của kiểu dữ liệu, thay vì chuyên gia cơ sở dữ liệu.

kèo chấp bóng đá hôm nay số thông tin ở đây có nguồn gốc từ Dự án lập chỉ mục SP-Gist của Đại học PurdueTrang web. Thekèo chấp bóng đá hôm naytriển khai kèo chấp bóng đá hôm nayPostgreSQLchủ yếu được duy trì bởi Teodor Sigaev và Oleg Bartunov, và có thêm thông tin về của họTrang web.

64.3.2.kèo chấp bóng đá hôm nay lớp toán tử tích hợp#

CorePostgreSQLPhân phối bao gồmkèo chấp bóng đá hôm naykèo chấp bóng đá hôm nay lớp toán tử hiển thị trongBảng 64.2.

Bảng 64.2.Tích hợpkèo chấp bóng đá hôm naykèo chấp bóng đá hôm nay lớp toán tử

tên Toán tử có thể lập chỉ mục kèo chấp bóng đá hôm 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)
inet_ops << (inet, inet)
<< = (inet, inet)
(inet, inet)
= (inet, inet)
= (inet, inet)
< (inet, inet)
<(inet, inet)
<= (inet, inet)
(inet, inet)
= (inet, inet)
&& (inet, inet)
kd_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)
poly_ops << (Polygon, Polygon) <- (đa giác, điểm)
& <(Polygon, Polygon)
& (đa giác, đa giác)
(đa giác, đa giác)
<@ (Polygon, Polygon)
@ (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)
| & (đa giác, đa giác)
Quad_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)
Range_ops = (Anyrange, Anyrange)
&& (Anyrange, Anyrange)
@ (Anyrange, AnyEuity)
@ (Anyrange, Anyrange)
<@ (Anyrange, Anyrange)
<< (Anyrange, Anyrange)
(Anyrange, Anyrange)
& <(Anyrange, Anyrange)
& (Anyrange, Anyrange)
- |- (Anyrange, Anyrange)
Text_ops = (văn bản, văn bản)
<(văn bản, văn bản)
<= (văn bản, văn bản)
(văn bản, văn bản)
= (văn bản, văn bản)
~ <~ (văn bản, văn bản)
~ <= ~ (văn bản, văn bản)
~ = ~ (văn bản, văn bản)
~ ~ (văn bản, văn bản)
^@ (văn bản, văn bản)

của hai lớp toán tử cho loạiđiểm, Quad_Point_opslà mặc định.kd_point_opsHỗ trợ kèo chấp bóng đá hôm nay toán tử giống nhau nhưng sử dụng cấu trúc dữ liệu chỉ mục khác có thể cung cấp hiệu suất tốt hơn trong một số ứng dụng.

TheQuad_Point_ops, kd_point_opsPoly_opskèo chấp bóng đá hôm nay lớp vận hành hỗ trợ<-Toán tử đặt hàng, cho phép người hàng xóm gần nhất K (K-NN) Tìm kiếm qua kèo chấp bóng đá hôm nay tập dữ liệu điểm hoặc đa giác được lập chỉ mục.

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

kèo chấp bóng đá hôm naycung cấp một giao diện với mức độ trừu tượng cao, yêu cầu nhà phát triển phương thức truy cập chỉ thực hiện kèo chấp bóng đá hôm nay phương thức cụ thể cho một loại dữ liệu nhất định. Thekèo chấp bóng đá hôm nayCore chịu trách nhiệm ánh xạ đĩa hiệu quả và tìm kiếm cấu trúc cây. Nó cũng quan tâm đến kèo chấp bóng đá hôm nay cân nhắc đồng thời và ghi nhật ký.

Bộ đôi lá của kèo chấp bóng đá hôm naykèo chấp bóng đá hôm nayCây thường chứa kèo chấp bóng đá hôm nay giá trị của cùng loại dữ liệu với cột được lập chỉ mục, mặc dù chúng cũng có thể chứa kèo chấp bóng đá hôm nay biểu diễn mất của cột được lập chỉ mục. kèo chấp bóng đá hôm nay bộ dữ liệu lá được lưu trữ ở cấp độ gốc sẽ biểu thị trực tiếp giá trị dữ liệu được lập chỉ mục ban đầu, nhưng kèo chấp bóng đá hôm nay bộ dữ liệu lá ở mức thấp hơn có thể chỉ chứa một giá trị một phần, chẳng hạn như hậu tố.

Khi kèo chấp bóng đá hôm naykèo chấp bóng đá hôm nayChỉ mục được tạo bằngBao gồmCột, kèo chấp bóng đá hôm nay giá trị của kèo chấp bóng đá hôm nay cột đó cũng được lưu trữ trong kèo chấp bóng đá hôm nay bộ dữ liệu lá. TheBao gồmkèo chấp bóng đá hôm nay cột không quan tâm đếnkèo chấp bóng đá hôm naylớp toán tử, vì vậy chúng không được thảo luận thêm ở đây.

Bộ dữ liệu bên trong phức tạp hơn, vì chúng là kèo chấp bóng đá hôm nay điểm phân nhánh trong cây tìm kiếm. Mỗi tuple bên trong chứa một tập hợp một hoặc nhiềunút, đại diện cho kèo chấp bóng đá hôm nay nhóm kèo chấp bóng đá hôm nay giá trị lá tương tự. Một nút chứa một đường xuống dẫn đến một phần bên trong cấp độ khác, hoặc vào một danh sách ngắn kèo chấp bóng đá hôm nay bộ dữ liệu lá nằm trên cùng một trang chỉ mục.nhãnmô tả nó; Ví dụ, trong kèo chấp bóng đá hôm nay cây radix, nhãn nút có thể là ký tự tiếp theo của giá trị chuỗi.Phần 64.3.4.2.) Tùy chọn, kèo chấp bóng đá hôm nay tuple bên trong có thể cótiền tốGiá trị mô tả tất cả kèo chấp bóng đá hôm nay thành viên của nó. Trong một cây radix, đây có thể là tiền tố phổ biến của kèo chấp bóng đá hôm nay chuỗi được đại diện.

kèo chấp bóng đá hôm nay số thuật toán cây yêu cầu kiến ​​thức về cấp độ (hoặc độ sâu) của tuple hiện tại, vì vậykèo chấp bóng đá hôm nayCore cung cấp khả năng cho kèo chấp bóng đá hôm nay lớp vận hành để quản lý việc đếm mức trong khi giảm dần cây. Ngoài ra còn có hỗ trợ cho việc xây dựng lại giá trị được biểu diễn tăng dần khi đó là cần thiết và để truyền dữ liệu bổ sung (được gọi làGiá trị Traverse) trong khi kèo chấp bóng đá hôm nay cây gốc.

Lưu ý

Thekèo chấp bóng đá hôm nayMã cốt lõi chăm sóc kèo chấp bóng đá hôm nay mục NULL. Mặc dùkèo chấp bóng đá hôm nayIndexes do kèo chấp bóng đá hôm nay mục lưu trữ cho kèo chấp bóng đá hôm nay null trong kèo chấp bóng đá hôm nay cột được lập chỉ mục, điều này được ẩn khỏi mã lớp toán tử chỉ mục: Không có mục nhập chỉ mục null hoặc điều kiện tìm kiếm sẽ được chuyển đến kèo chấp bóng đá hôm nay phương thức của lớp vận hành. (Giả định rằngkèo chấp bóng đá hôm nayNgười vận hành nghiêm ngặt và do đó không thể thành công cho kèo chấp bóng đá hôm nay giá trị null.) Do đó, kèo chấp bóng đá hôm nay giá trị null không được thảo luận thêm ở đây.

Có năm phương thức do người dùng xác định là lớp toán tử chỉ mục chokèo chấp bóng đá hôm nayphải cung cấp và hai là tùy chọn. Tất cả năm phương pháp bắt buộc tuân theo quy ước kèo chấp bóng đá hôm nay nhận haiNội bộĐối số, trong đó đầu tiên là con trỏ tới cấu trúc C chứa kèo chấp bóng đá hôm nay giá trị đầu vào cho phương thức hỗ trợ, trong khi đối số thứ hai là một con trỏ tới cấu trúc C nơi phải đặt giá trị đầu ra. Bốn trong số kèo chấp bóng đá hôm nay phương thức bắt buộc chỉ trả vềvoid, vì tất cả kèo chấp bóng đá hôm nay kết quả của chúng xuất hiện trong cấu trúc đầu ra; NhưngLeaf_consistentTrả về ABooleanKết quả. kèo chấp bóng đá hôm nay phương thức không được sửa đổi bất kỳ trường nào của kèo chấp bóng đá hôm nay cấu trúc đầu vào của chúng.nénkèo chấp bóng đá hôm nay nhận ADatumđược lập chỉ mục là đối số duy nhất và trả về giá trị phù hợp cho lưu trữ vật lý trong kèo chấp bóng đá hôm nay tuple lá. Phương pháp thứ bảy tùy chọnTùy chọnkèo chấp bóng đá hôm nay nhậnNội bộCon trỏ tới một cấu trúc C, trong đó nên đặt kèo chấp bóng đá hôm nay tham số dành riêng cho OPClass và trả vềvoid.

Năm phương thức do người dùng bắt buộc xác định là:

config

Trả về thông tin tĩnh về việc triển khai chỉ mục, bao gồm kèo chấp bóng đá hôm nay loại OID loại dữ liệu của tiền tố và kèo chấp bóng đá hôm nay loại dữ liệu nhãn nút.

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

Tạo hàm my_config (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là con trỏ tớispgconfiginC struct, chứa dữ kèo chấp bóng đá hôm nay đầu vào cho chức năng. Đối số thứ hai là một con trỏ tớispgconfigoutC struct, mà hàm phải điền vào dữ kèo chấp bóng đá hôm nay kết quả.

typedef struct spgconfigin

atttypeđược thông qua để hỗ trợ kèo chấp bóng đá hôm nay lớp toán tử chỉ số đa hình; Đối với kèo chấp bóng đá hôm nay lớp toán tử loại dữ liệu cố định thông thường, nó sẽ luôn có cùng giá trị và do đó có thể bị bỏ qua.

Đối với kèo chấp bóng đá hôm nay lớp toán tử không sử dụng tiền tố,PrefixTypecó thể được đặt thànhVOIDOID. Tương tự như vậy, đối với kèo chấp bóng đá hôm nay lớp toán tử không sử dụng nhãn nút,LabelTypecó thể được đặt thànhVOIDOID. CanreturnDatanên được đặt đúng nếu lớp toán tử có khả năng xây dựng lại giá trị chỉ mục được cung cấp ban đầu.LongValuesokChỉ nên đặt đúng khiatttypecó độ dài thay đổi và lớp toán tử có khả năng phân đoạn kèo chấp bóng đá hôm nay giá trị dài bằng cách lặp lại (xemPhần 64.3.4.1).

LeafTypeNên khớp với loại lưu trữ chỉ mục được xác định bởi lớp vận hànhOpckeyTypemục nhập danh mục. (Lưu ý rằngOpckeyTypecó thể bằng không, ngụ ý loại lưu trữ giống như loại đầu vào của lớp toán tử, là tình huống phổ biến nhất.) Vì lý do tương thích ngược,configPhương thức có thể đặtLeafTypevới một số giá trị khác và giá trị đó sẽ được sử dụng; Nhưng điều này không được chấp nhận vì nội dung chỉ mục sau đó được xác định không chính xác trong kèo chấp bóng đá hôm nay danh mục.LeafTypeUninitialized (không); được hiểu là có nghĩa là loại lưu trữ chỉ mục có nguồn gốc từOpckeyType.

KhiatttypeLeafTypelà khác nhau, phương pháp tùy chọnnénphải được cung cấp. Phương phápnénchịu trách nhiệm chuyển đổi kèo chấp bóng đá hôm nay mốc dữ liệu được lập chỉ mục từatttypeđếnLeafType.

Chọn

Chọn kèo chấp bóng đá hôm nay phương thức để chèn kèo chấp bóng đá hôm nay giá trị mới vào kèo chấp bóng đá hôm nay tuple bên trong.

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

Tạo hàm my_choose (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là kèo chấp bóng đá hôm nay con trỏ tớispgchooseinC struct, chứa dữ kèo chấp bóng đá hôm nay đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgchooseoutC struct, mà hàm phải điền vào dữ kèo chấp bóng đá hôm nay kết quả.

Typedef struct spgchoosein

Datumlà dữ kèo chấp bóng đá hôm nay ban đầu củaspgconfigin.atttypeLoại được chèn vào chỉ mục.LeafDatumlà giá trị củaspgconfigout.LeafTypeLoại, ban đầu là kết quả của phương thứcnénÁp dụng choDatumKhi phương thứcnénđược cung cấp hoặc cùng giá trị vớiDatumnếu không.LeafDatumCó thể thay đổi ở kèo chấp bóng đá hôm nay cấp thấp hơn của cây nếuChọnhoặcPickSplitPhương pháp thay đổi nó. Khi tìm kiếm chèn đạt đến kèo chấp bóng đá hôm nay trang lá, giá trị hiện tại củaLeafDatumlà những gì sẽ được lưu trữ kèo chấp bóng đá hôm nay Tuple lá mới được tạo.cấplà cấp độ của Tuple bên kèo chấp bóng đá hôm nay hiện tại, bắt đầu từ 0 cho mức gốc.Allthesamelà đúng nếu bộ tple bên kèo chấp bóng đá hôm nay hiện tại được đánh dấu là chứa nhiều nút tương đương (xemPhần 64.3.4.3).Hasprefixlà đúng nếu bộ tple bên kèo chấp bóng đá hôm nay dòng điện chứa tiền tố; Nếu vậy,PrefixDatumlà giá trị của nó.nnodeslà số nút con có kèo chấp bóng đá hôm nay phần bên kèo chấp bóng đá hôm nay vàNodelabelslà một mảng của kèo chấp bóng đá hôm nay giá trị nhãn của chúng hoặc null nếu không có nhãn.

TheChọnHàm có thể xác định rằng giá trị mới phù hợp với một trong kèo chấp bóng đá hôm nay nút con hiện có hoặc nút con mới phải được thêm vào hoặc giá trị mới không phù hợp với tiền tố tuple và do đó, bộ tuple bên trong phải được chia để tạo ra một tiền tố ít hạn chế hơn.

Nếu giá trị mới khớp với một trong kèo chấp bóng đá hôm nay nút con hiện có, SETresultTypeđếnSPGMatchNode. BộNodenđến chỉ mục (từ 0) của nút đó kèo chấp bóng đá hôm nay mảng nút. BộLeveladdđến mức tăng kèo chấp bóng đá hôm naycấpgây ra do đi xuống qua nút đó hoặc để nó dưới dạng 0 nếu lớp toán tử không sử dụng cấp độ. BộrestDatumđến bằngLeafDatumNếu lớp toán tử không sửa đổi dữ kèo chấp bóng đá hôm nay từ cấp này sang cấp độ tiếp theo hoặc đặt nó thành giá trị sửa đổi được sử dụng làmLeafDatumở cấp độ tiếp theo.

Nếu phải thêm nút con mới, đặtresultTypeđếnspgaddnode. BộNodelabelđến nhãn sẽ được sử dụng cho nút mới và đặtNodenđến chỉ mục (từ 0) để chèn nút vào mảng nút. Sau khi nút đã được thêm vào,ChọnHàm sẽ được gọi lại với bộ tuple bên trong được sửa đổi; cuộc gọi đó sẽ dẫn đến kèo chấp bóng đá hôm naySPGMatchNoderesult.

Nếu giá trị mới không phù hợp với tiền tố tuple, setresultTypeđếnspgsplittuple. Hành động này di chuyển tất cả kèo chấp bóng đá hôm nay nút hiện có vào một bộ tải bên trong cấp thấp hơn và thay thế bộ tuple bên trong hiện có bằng một tuple có một đường xuống duy nhất chỉ vào bộ tple bên trong cấp thấp hơn mới.prefixhasprefixĐể cho biết kèo chấp bóng đá hôm nay Tuple trên mới có nên có tiền tố hay không và nếu vậy SET SETprefixprefixdatumvới giá trị tiền tố. Giá trị tiền tố mới này phải đủ hạn chế hơn so với bản gốc để kèo chấp bóng đá hôm nay nhận giá trị mới được lập chỉ mục.prefixnnodesvới số lượng nút cần thiết kèo chấp bóng đá hôm nay bộ tuple mới và đặtprefixnodelabelsđến kèo chấp bóng đá hôm nay mảng palloc'd giữ nhãn của họ hoặc không cần nhãn nếu không cần nhãn nút. Lưu ý rằng tổng kích thước của tuple trên mới phải không quá tổng kích thước của bộ tuple mà nó đang thay thế;Childnodenđến chỉ mục (từ số 0) của nút sẽ liên kết xuống cấp độ bên kèo chấp bóng đá hôm nay cấp thấp hơn mới. BộPOSTFIXHASPREFIXĐể cho biết kèo chấp bóng đá hôm nay Tuple bên trong cấp thấp mới có nên có tiền tố hay không và nếu vậy được đặtPOSTFIXPREFIXDATUMvới giá trị tiền tố. Sự kết hợp của hai tiền tố này và nhãn của nút đường xuống (nếu có) phải có ý nghĩa tương tự như tiền tố ban đầu, bởi vì không có cơ hội thay đổi nhãn nút được chuyển sang tuple cấp thấp hơn, cũng như không thay đổi bất kỳ mục chỉ mục con nào.ChọnHàm sẽ được gọi lại với bộ tuple bên trong thay thế. Cuộc gọi đó có thể trả về kèo chấp bóng đá hôm nayspgaddnodeKết quả, nếu không có nút phù hợp nào được tạo bởispgsplittupleHành động. Sau cùngChọnphải trả lạiSPGMatchNodeĐể cho phép chèn xuống cấp độ tiếp theo.

PickSplit

Quyết định làm thế nào để tạo một bộ tple bên trong mới trên một bộ kèo chấp bóng đá hôm nay bộ dữ

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

Tạo hàm my_picksplit (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là con trỏ tớispgpicksplitinC struct, chứa dữ kèo chấp bóng đá hôm nay đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgpicksplitoutC Struct, mà hàm phải điền vào dữ kèo chấp bóng đá hôm nay kết quả.

typedef struct spgpicksplitin

ntupleslà số lượng kèo chấp bóng đá hôm nay bộ dữ liệu lá được cung cấp.Datumslà một mảng kèo chấp bóng đá hôm nay giá trị mốc của chúng làspgconfigout.LeafTypeloại.cấp41205_41312

setHasprefixĐể cho biết kèo chấp bóng đá hôm nay tuple bên trong mới có nên có tiền tố hay không và nếu vậy được đặtprefixdatumvới giá trị tiền tố. BộnnodesĐể chỉ ra số lượng nút mà bộ tple bên kèo chấp bóng đá hôm nay mới sẽ chứa và đặtNodelabelsđến một mảng kèo chấp bóng đá hôm nay giá trị nhãn của chúng hoặc không cần nhãn nếu không cần nhãn nút. BộMaptuplestonodescho kèo chấp bóng đá hôm nay mảng cung cấp cho chỉ mục (từ 0) của nút mà mỗi tuple của lá nên được gán cho. BộLEAFTUPLEDATUMSđến một mảng kèo chấp bóng đá hôm nay giá trị được lưu trữ trong kèo chấp bóng đá hôm nay bộ dữ liệu lá mới (chúng sẽ giống như đầu vàoDatumsNếu lớp toán tử không sửa đổi dữ kèo chấp bóng đá hôm nay từ cấp độ này sang cấp độ tiếp theo). Lưu ý rằngpicksplitHàm chịu trách nhiệm cho việc palloc'ing theNodelabels, MaptuplestonodesLEAFTUPLEDATUMSmảng.

Nếu có nhiều hơn kèo chấp bóng đá hôm nay tuple được cung cấp, dự kiếnPickSplitHàm sẽ phân loại chúng thành nhiều hơn một nút; Nếu không, không thể chia kèo chấp bóng đá hôm nay bộ dữ liệu lá trên nhiều trang, đó là mục đích cuối cùng của hoạt động này.picksplitHàm cuối cùng đặt tất cả kèo chấp bóng đá hôm nay bộ dữ liệu lá trong cùng một nút, mã sp-gist cốt lõi sẽ ghi đè quyết định đó và tạo ra một bộ thuật bên trong trong đó kèo chấp bóng đá hôm nay bộ dữ liệu lá được gán ngẫu nhiên cho một số nút được dán nhãn giống hệt nhau. Một tuple như vậy được đánh dấuAllthesameĐể biểu thị rằng điều này đã xảy ra. TheChọnInside_consistentkèo chấp bóng đá hôm nay chức năng phải được chăm sóc phù hợp với kèo chấp bóng đá hôm nay bộ dữ liệu bên trong đó. XemPhần 64.3.4.3Để biết thêm thông tin.

PickSplitchỉ có thể được áp dụng cho kèo chấp bóng đá hôm nay tuple kèo chấp bóng đá hôm nay lá duy nhất trong trường hợpconfigbộ chức năngLongValuesokĐể đúng và giá trị đầu vào lớn hơn kèo chấp bóng đá hôm nay trang đã được cung cấp. Trong trường hợp này, điểm của hoạt động là loại bỏ kèo chấp bóng đá hôm nay tiền tố và tạo ra kèo chấp bóng đá hôm nay giá trị mốc thời gian mới, ngắn hơn.Phần 64.3.4.1Để biết thêm thông tin.

Inside_consistent

Trả về bộ nút (nhánh) để theo dõi kèo chấp bóng đá hôm nay quá trình tìm kiếm cây.

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

Tạo chức năng my_inner_consistent (nội bộ, nội bộ) trả về void ...

Đối số đầu tiên là con trỏ tớispginnerconsistentinC struct, chứa dữ kèo chấp bóng đá hôm nay đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispginnerconsistentoutC struct, mà hàm phải điền vào dữ kèo chấp bóng đá hôm nay kết quả.

typedef struct spginnerconsistentin

mảngSwunkey, của độ dàiNKEYS, mô tả (kèo chấp bóng đá hôm nay) điều kiện tìm kiếm chỉ mục. Những điều kiện này được kết hợp với và - chỉ kèo chấp bóng đá hôm nay mục chỉ mục đáp ứng tất cả chúng là thú vị.NKEYS= 0 ngụ ý rằng tất cả kèo chấp bóng đá hôm nay mục chỉ mục đều thỏa mãn truy vấn.) Thông thường chức năng nhất quán chỉ quan tâm đếnSK_Strargetysk_argumentkèo chấp bóng đá hôm nay trường của mỗi mục nhập mảng, tương ứng cung cấp cho toán tử có thể lập chỉ mục và giá trị so sánh. Cụ thể, không cần thiết phải kiểm traSK_FLAGSĐể xem giá trị so sánh có phải là NULL hay không, vì mã lõi SP-Gist sẽ lọc ra kèo chấp bóng đá hôm nay điều kiện đó. MảngOrderBys, độ dàiNorderbys, mô tả kèo chấp bóng đá hôm nay toán tử đặt hàng (nếu có) theo cách tương tự.Tái thiếtlà giá trị được xây dựng lại cho tuple cha mẹ; nó là(Datum) 0Ở cấp độ gốc hoặc nếuInside_consistentHàm không cung cấp giá trị ở cấp cha mẹ.TraversalValuelà một con trỏ tới bất kỳ dữ kèo chấp bóng đá hôm nay di chuyển nào được truyền từ cuộc gọi trước đó củaInside_consistentTrên Tuple Index hoặc NULL ở cấp độ gốc.Traversalmemorycontextlà bối cảnh bộ nhớ để lưu trữ kèo chấp bóng đá hôm nay giá trị truyền qua đầu ra (xem bên dưới).cấplà cấp độ của Tuple bên kèo chấp bóng đá hôm nay hiện tại, bắt đầu ở mức 0 cho mức gốc.returnDataTRUENếu cần phải xây dựng lại dữ kèo chấp bóng đá hôm nay cho truy vấn này; Điều này sẽ chỉ như vậy nếuconfigChức năng được xác nhậnCanreturnData. Allthesamelà đúng nếu bộ tple bên kèo chấp bóng đá hôm nay hiện tại được đánh dấuTất cả-Same; Trong trường hợp này, tất cả kèo chấp bóng đá hôm nay nút đều có cùng một nhãn (nếu có) và do đó, tất cả hoặc không ai trong số chúng khớp với truy vấn (xemPhần 64.3.4.3).Hasprefixlà đúng nếu bộ tple bên kèo chấp bóng đá hôm nay dòng điện chứa tiền tố; Nếu vậy,prefixdatumlà giá trị của nó.nnodeslà số nút con có kèo chấp bóng đá hôm nay bộ tuple bên kèo chấp bóng đá hôm nay vàNodelabelslà một mảng của kèo chấp bóng đá hôm nay giá trị nhãn của chúng hoặc null nếu kèo chấp bóng đá hôm nay nút không có nhãn.

nnodesphải được đặt thành số nút con cần được truy cập bởi tìm kiếm vàNodenumbersphải được đặt thành một mảng kèo chấp bóng đá hôm nay chỉ mục của họ. Nếu lớp toán tử theo dõi kèo chấp bóng đá hôm nay cấp, SETLeveladdsđến kèo chấp bóng đá hôm nay mảng có mức tăng cấp độ cần thiết khi giảm xuống mỗi nút sẽ được truy cập. .Tái thiếtđến một mảng kèo chấp bóng đá hôm nay giá trị được xây dựng lại cho mỗi nút con được truy cập; Nếu không, rời khỏiTái thiếtnhư null. kèo chấp bóng đá hôm nay giá trị được xây dựng lại được giả sử là loạispgconfigout.LeafType. (Tuy nhiên, vì hệ thống cốt lõi sẽ không làm gì với họ ngoại trừ có thể sao chép chúng, nên chúng có cùng kèo chấp bóng đá hôm nayTyplenTYPBYVALThuộc tính làLeafType.) Nếu thực hiện tìm kiếm được đặt hàng, đặtkhoảng cáchđến một mảng kèo chấp bóng đá hôm nay giá trị khoảng cách theoOrderBysMảng (kèo chấp bóng đá hôm nay nút có khoảng cách thấp nhất sẽ được xử lý trước). Để nó không có gì khác.Giá trị Traverse) đến mức thấp hơn của tìm kiếm cây, đặtTraversalValuesđến một mảng kèo chấp bóng đá hôm nay giá trị đi qua thích hợp, một cho mỗi nút con được truy cập; Nếu không, rời khỏiTraversalValuesnhư null. Lưu ý rằngInside_consistentHàm chịu trách nhiệm cho việc palloc'ing theNodeNumbers, LevelAdds, khoảng cách, Tái thiếtTraversalValuesMảng kèo chấp bóng đá hôm nay bối cảnh bộ nhớ hiện tại. Tuy nhiên, bất kỳ giá trị truyền qua đầu ra nào cũng được chỉ ra bởiTraversalValuesMảng phải được phân bổ kèo chấp bóng đá hôm nayTraversalmemorycontext. Mỗi giá trị đi qua phải là kèo chấp bóng đá hôm nay khối palloc'd duy nhất.

Leaf_consistent

Trả về đúng nếu kèo chấp bóng đá hôm nay tuple lá thỏa mãn truy vấn.

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

Tạo chức năng my_leaf_consistent (nội bộ, nội bộ) trả về Bool ...

Đối số đầu tiên là con trỏ tớispgleafconsistentinC struct, chứa dữ kèo chấp bóng đá hôm nay đầu vào cho hàm. Đối số thứ hai là một con trỏ tớispgleafconsistentoutC struct, mà hàm phải điền vào dữ kèo chấp bóng đá hôm nay kết quả.

typedef struct spgleafconsistentin

MảngDickkeys, độ dàiNKEYS, mô tả (kèo chấp bóng đá hôm nay) điều kiện tìm kiếm chỉ mục. Những điều kiện này được kết hợp với và - chỉ kèo chấp bóng đá hôm nay mục chỉ mục thỏa mãn tất cả chúng thỏa mãn truy vấn.NKEYS= 0 ngụ ý rằng tất cả kèo chấp bóng đá hôm nay mục nhập chỉ mục đều thỏa mãn truy vấn.) Thông thường chức năng nhất quán chỉ quan tâm đếnSK_Strargetysk_argumentkèo chấp bóng đá hôm nay trường của mỗi mục nhập mảng, tương ứng cung cấp cho toán tử có thể lập chỉ mục và giá trị so sánh. Cụ thể, không cần thiết phải kiểm traSK_FLAGSĐể xem giá trị so sánh có phải là NULL hay không, vì mã lõi SP-Gist sẽ lọc ra kèo chấp bóng đá hôm nay điều kiện đó. MảngOrderBys, độ dàiNorderbys, mô tả kèo chấp bóng đá hôm nay toán tử đặt hàng theo cách tương tự.Tái thiếtlà giá trị được xây dựng lại cho tuple cha mẹ; nó là(Datum) 0ở cấp độ gốc hoặc nếuInside_consistentHàm không cung cấp giá trị ở cấp độ cha mẹ.TraversalValuelà một con trỏ tới bất kỳ dữ kèo chấp bóng đá hôm nay di chuyển nào được truyền từ cuộc gọi trước đó củaInside_consistentTrên Tuple Index hoặc NULL ở cấp độ gốc.Cấplà cấp độ của Lá hiện tại, bắt đầu từ 0 cho mức gốc.returnDataTRUENếu cần phải xây dựng lại dữ kèo chấp bóng đá hôm nay cho truy vấn này; Điều này sẽ chỉ như vậy nếuconfigchức năng được xác nhậnCanreturnData. LeafDatumlà giá trị chính củaspgconfigout.​​LeafTypeĐược lưu trữ kèo chấp bóng đá hôm nay tuple lá hiện tại.

Hàm phải trả vềTRUENếu bộ tple của lá phù hợp với truy vấn hoặcSaiNếu không. kèo chấp bóng đá hôm nayTRUEtrường hợp, nếureturnDataTRUEsau đóLeafValuephải được đặt thành giá trị (loạispgconfigin.atttype) Ban đầu được cung cấp để được lập chỉ mục cho bộ gốc lá này. Cũng,Recheckcó thể được đặt thànhTRUENếu trận đấu không chắc chắn và do đó, kèo chấp bóng đá hôm nay toán tử phải được ứng dụng lại vào bộ tple heap thực tế để xác minh trận đấu. Nếu tìm kiếm được đặt hàng được thực hiện, đặtkhoảng cáchđến một mảng kèo chấp bóng đá hôm nay giá trị khoảng cách theoOrderBysMảng. Để nó không có gì khác.Tái chếĐể đúng. Trong trường hợp này, người thực thi sẽ tính toán khoảng cách chính xác sau khi tìm nạp Tuple từ đống và sẽ sắp xếp lại kèo chấp bóng đá hôm nay bộ dữ liệu nếu cần.

kèo chấp bóng đá hôm nay phương thức do người dùng tùy chọn là:

Datum Compress (Datum in)

Chuyển đổi một mục dữ kèo chấp bóng đá hôm nay thành một định dạng phù hợp để lưu trữ vật lý trong một bộ gốc của chỉ mục. Nó chấp nhận một giá trị của loạispgconfigin.atttypevà trả về giá trị của loạispgconfigout.LeafType. Giá trị đầu ra không được chứa kèo chấp bóng đá hôm nay con trỏ bánh mì nướng ngoài đường.

Lưu ý: ThenénPhương pháp chỉ được áp dụng cho kèo chấp bóng đá hôm nay giá trị được lưu trữ. kèo chấp bóng đá hôm nay phương thức nhất quán nhận truy vấnSwunkeyKhông thay đổi, mà không chuyển đổi bằng cách sử dụngnén.

Tùy chọn

Xác định một tập hợp kèo chấp bóng đá hôm nay tham số có thể nhìn thấy người dùng có thể đ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ộ)

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

Kể từ khi biểu diễn khóa kèo chấp bóng đá hôm naykèo chấp bóng đá hôm naylà linh hoạt, nó có thể phụ thuộc vào kèo chấp bóng đá hôm nay tham số do người dùng chỉ định.

Tất cả kèo chấp bóng đá hôm nay phương pháp hỗ trợ SP-Gist thường được gọi trong bối cảnh bộ nhớ ngắn; đó là,CurrentMemoryContextsẽ được đặt lại sau khi xử lý mỗi tuple. Do đó, không phải là rất quan trọng để lo lắng về việc mọi thứ bạn palloc.configPhương pháp là kèo chấp bóng đá hôm nay ngoại lệ: Nó nên cố gắng tránh rò rỉ bộ nhớ. Nhưng thường làconfigPhương thức không cần làm gì ngoài việc gán kèo chấp bóng đá hôm nay hằng số vào cấu trúc tham số truyền.)

Nếu cột được lập chỉ mục thuộc loại dữ liệu có thể va chạm, đối chiếu chỉ mục sẽ được chuyển cho tất cả kèo chấp bóng đá hôm nay phương thức hỗ trợ, sử dụng tiêu chuẩnpg_get_collation ()cơ chế.

64.3.4.Triển khai#

Phần này bao gồm kèo chấp bóng đá hôm nay chi tiết triển khai và kèo chấp bóng đá hôm nay thủ thuật khác hữu ích cho người thực hiệnkèo chấp bóng đá hôm naykèo chấp bóng đá hôm nay lớp vận hành để biết.

64.3.4.1.Giới hạn kèo chấp bóng đá hôm nay#

Bộ dữ liệu lá riêng lẻ và bộ dữ liệu bên trong phải phù hợp với một trang chỉ mục duy nhất (8kb theo mặc định). Do đó, khi lập chỉ mục kèo chấp bóng đá hôm nay giá trị của kèo chấp bóng đá hôm nay loại dữ liệu có độ dài thay đổi, kèo chấp bóng đá hôm nay giá trị dài chỉ có thể được hỗ trợ bằng kèo chấp bóng đá hôm nay phương thức như cây radix, trong đó mỗi cấp độ của cây bao gồm một tiền tố đủ ngắn để phù hợp với một trang và mức lá cuối cùng bao gồm một hậu tố cũng đủ ngắn để phù hợp với trang.LongValuesokchỉ đúng nếu nó được chuẩn bị để sắp xếp điều này xảy ra. Nếu không,kèo chấp bóng đá hôm nayCore sẽ từ chối mọi yêu cầu để lập chỉ mục kèo chấp bóng đá hôm nay giá trị quá lớn để phù hợp với trang chỉ mục.

Tương tự như vậy, trách nhiệm của lớp vận hành là kèo chấp bóng đá hôm nay bộ dữ liệu bên trong không phát triển quá lớn để phù hợp với trang chỉ mục; Điều này giới hạn số lượng nút con có thể được sử dụng trong một bộ bên trong, cũng như kích thước tối đa của giá trị tiền tố.

Một giới hạn khác là khi nút của một tuple bên trong chỉ vào một tập hợp kèo chấp bóng đá hôm nay bộ dữ liệu lá, tất cả kèo chấp bóng đá hôm nay bộ dữ liệu đó phải nằm trong cùng một trang chỉ mục. .phảiChia tập hợp kèo chấp bóng đá hôm nay giá trị lá thành nhiều hơn một nhóm nút. Nếu lớp vận hànhPickSplitHàm không làm điều đó,kèo chấp bóng đá hôm nayKhu nghỉ dưỡng cốt lõi để kèo chấp bóng đá hôm nay biện pháp phi thường được mô tả trongPhần 64.3.4.3.

KhiLongValuesoklà đúng, người ta hy vọng rằng kèo chấp bóng đá hôm nay mức liên tiếp củakèo chấp bóng đá hôm nayCây sẽ hấp thụ ngày càng nhiều thông tin vào kèo chấp bóng đá hôm nay tiền tố và nhãn nút của kèo chấp bóng đá hôm nay bộ dữ liệu bên trong, làm cho mốc dữ liệu lá cần thiết nhỏ hơn và nhỏ hơn, do đó nó sẽ phù hợp trên một trang. Để ngăn chặn kèo chấp bóng đá hôm nay lỗi trong kèo chấp bóng đá hôm nay lớp toán tử gây ra kèo chấp bóng đá hôm nay vòng chèn vô hạn,kèo chấp bóng đá hôm nayCore sẽ gây ra lỗi nếu mốc dữ kèo chấp bóng đá hôm nay lá không trở nên nhỏ hơn trong vòng mười chu kỳChọnCuộc gọi phương thức.

64.3.4.2.kèo chấp bóng đá hôm nay không có nhãn nút#

Một số thuật toán cây sử dụng một tập hợp kèo chấp bóng đá hôm nay nút cố định cho mỗi tuple bên trong; Ví dụ, trong một cây bốn, luôn có chính xác bốn nút tương ứng với bốn góc phần tư xung quanh điểm trung tâm của Tuple bên trong.PickSplitHàm có thể trả về null choNodelabelsmảng và tương tự như vậyChọnHàm có thể trả về null choPrefixNodelabelsmảng trong kèo chấp bóng đá hôm nayspgsplittupleHành động. Điều này sẽ lần lượt dẫn đếnNodelabelsĐang null trong kèo chấp bóng đá hôm nay cuộc gọi tiếp theo đếnChọnInside_consistent. Về nguyên tắc, kèo chấp bóng đá hôm nay nhãn nút có thể được sử dụng cho một số bộ dữ liệu bên trong và bị bỏ qua cho những người khác trong cùng một chỉ mục.

Khi làm việc với một tuple bên trong có kèo chấp bóng đá hôm nay nút không nhãn, đó là một lỗi choChọnđể trả lạispgaddnode, vì tập hợp kèo chấp bóng đá hôm nay nút được cho là được sửa trong kèo chấp bóng đá hôm nay trường hợp như vậy.

64.3.4.3.Tất cả-SameHàngBộ dữ kèo chấp bóng đá hôm nay bên trong#

Thekèo chấp bóng đá hôm nayCore có thể ghi đè kết quả của lớp vận hànhPickSplitchức năng khiPickSplitKhông chia kèo chấp bóng đá hôm nay giá trị lá được cung cấp thành ít nhất hai loại nút. Khi điều này xảy ra, bộ tuple bên trong mới được tạo với nhiều nút có cùng một nhãn (nếu có)PickSplitĐã cho một nút mà nó đã sử dụng và kèo chấp bóng đá hôm nay giá trị lá được chia ngẫu nhiên giữa kèo chấp bóng đá hôm nay nút tương đương này. TheAllthesameCờ được đặt ở bộ bên kèo chấp bóng đá hôm nay để cảnh báoChọnInside_consistentkèo chấp bóng đá hôm nay chức năng mà Tuple không có bộ nút mà họ có thể mong đợi.

Khi xử lýAllthesameTuple, AChọnKết quả củaSPGMatchNodeđược giải thích có nghĩa là giá trị mới có thể được gán cho bất kỳ nút tương đương nào; Mã cốt lõi sẽ bỏ qua được cung cấpNodenGiá trị và hạ xuống một trong kèo chấp bóng đá hôm nay nút một cách ngẫu nhiên (để giữ cho cây cân bằng). Nó là một lỗi choChọnđể trả lạispgaddnode, vì điều đó sẽ làm cho kèo chấp bóng đá hôm nay nút không tương đương; ThespgsplittupleHành động phải được sử dụng nếu giá trị được chèn không khớp với kèo chấp bóng đá hôm nay nút hiện có.

Khi xử lý kèo chấp bóng đá hôm nayAllthesametuple, TheInside_consistentHàm sẽ trả về tất cả hoặc không có nút nào làm mục tiêu để tiếp tục tìm kiếm chỉ mục, vì tất cả chúng đều tương đương. Điều này có thể hoặc không yêu cầu bất kỳ mã trường hợp đặc biệt nào, tùy thuộc vào số lượngInside_consistentHàm thường giả sử về ý nghĩa của kèo chấp bóng đá hôm nay nút.

64.3.5.Ví dụ#

ThePOSTGRESQLPhân phối nguồn bao gồm một số ví dụ về kèo chấp bóng đá hôm nay lớp toán tử chỉ mục chokèo chấp bóng đá hôm nay, như được mô tả kèo chấp bóng đá hôm nayBảng 64.2. Nhìn vàoSRC/Backend/Access/Spgist/src/backend/utils/adt/Để xem mã.

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài kèo chấp bóng đá hôm nay không chính xác, không khớpMẫu nàyĐể báo cáo vấn đề tài kèo chấp bóng đá hôm nay.