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 đá c1 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.gistGiao 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 đá c1 đượ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.
kèo bóng đá c1 này không nên bị nhầm lẫn với kèo bóng đá c1 của các cây tìm kiếm tiêu chuẩn khác về dữ liệu mà chúng có thể xử lý. Ví dụ,PostgreSQLHỗ trợ các chỉ kèo bóng đá c1 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 so với bất kỳ loại dữ kèo bóng đá c1 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 đá c1 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 đá c1, hãy nói, một bộ sưu tập hình ảnh với APostgreSQLB-tree, bạn chỉ có thể phát hành các truy vấn nhưIS IS ISTIMX bằng với ImageyHồi, Hồi10230_10258HồivàHồi10317_10348Hồi. Tùy thuộc vào cách bạn xác địnhHồibằngHồi, Hồiít hơnHồivàlớ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 đá c1 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ựa108Postgresql: Tài liệu: 13: 64.3. Khả kèo bóng đá c1 mở rộng46hoặcHồiTìm tất cả các hình ảnh tiếp xúc quá mứcHồi.
Tất cả những gì cần thiết để có được mộtGistPhươ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 các khóa trong cây. Tất nhiên, các phương pháp này phải khá lạ mắt để hỗ trợ các truy vấn ưa thích, nhưng đối với tất cả các truy vấn tiêu chuẩn (B-cây, cây R, v.v.), chúng tương đối đơn giản.gistKết hợp độ mở rộng cùng với tính tổng quát, tái sử dụng mã và giao diện sạch.
Có năm phương thức mà một lớp toán tử chỉ kèo bóng đá c1 chogistphải cung cấp và năm người tùy chọn. Tính chính xác của chỉ kèo bóng đá c1 được đảm bảo bằng cách thực hiện đúngcùng
, nhất quán
vàUnion
Phương pháp, trong khi hiệu quả (kích thước và tốc độ) của chỉ kèo bóng đá c1 sẽ phụ thuộc vàohình phạt
vàPickSplit
Phương pháp. Hai phương thức tùy chọn lànén
vàgiải nén
, cho phép một chỉ kèo bóng đá c1 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 đá c1. Lá phải thuộc loại dữ liệu được lập chỉ kèo bóng đá c1, 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 đá c1 ở đây, xem vềVarlena
cho dữ kèo bóng đá c1 có kích thước biến). Nếu kiểu dữ kèo bóng đá c1 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ọnFetch
là cần thiết nếu lớp toán tử muốn hỗ trợ các lần quét chỉ có chỉ kèo bóng đá c1, ngoại trừ khinén
Phương pháp bị bỏ qua. Phương pháp thứ mười tùy chọnTùy chọn
là cần thiết nếu lớp toán tử cung cấp các tham số do người dùng chỉ định.
nhất quán
Cho kèo bóng đá c1 nhập chỉ kèo bóng đá c1P
và giá trị truy vấnQ
, Hàm này xác định xem kèo bóng đá c1 nhập chỉ kèo bóng đá c1 làHồinhất quánvới truy vấn; nghĩa là, có thể là vị ngữindexed_column
Indexable_operator
q
HồiHãy đúng với bất kỳ hàng nào được biểu thị bằng kèo bóng đá c1 nhập chỉ kèo bóng đá c1? Đối với kèo bóng đá c1 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 đá c1, 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.TRUE
, ARECHECK
Cờ cũng phải được trả về. Điều này cho biết kèo bóng đá c1 vị ngữ chắc chắn là đúng hay chỉ có thể đúng.Recheck
=Sai
Sau đó, chỉ kèo bóng đá c1 đã kiểm tra chính xác điều kiện vị ngữ, trong khi nếuRECHECK
=TRUE
Hàng chỉ là một trận đấu ứng cử viên. Trong trường hợp đó, hệ thống sẽ tự động đánh giáIndexable_operator
so với giá trị hàng thực tế để xem nó có thực sự là một 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.
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_consistent (nội bộ, data_type, smallint, oid, nội bộ)
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_consistent);
ở đây,Key
là một yếu tố trong chỉ kèo bóng đá c1 vàTruy vấn
Giá trị được tra cứu trong chỉ kèo bóng đá c1. TheStrategyNumber
Tham 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 các 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 đá c1 củaTruy vấn
có thể thay đổi theo toán tử, vì nó sẽ là bất kỳ loại nào ở phía bên tay của toán tử, có thể khác với loại dữ liệu được lập chỉ kèo bóng đá c1 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ấn
Giá trị đối số sẽ phải phụ thuộc vào toán tử.)nhất quán
chức kèo bóng đá c1 Sử dụng kiểu dữ liệu được lập chỉ mục 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 mục, chức kèo bóng đá c1 này tạo ra một mục chỉ mục mới đại diện cho tất cả các mục đã cho.
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_union (nội bộ, nội bộ)
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_union);
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 đá c1 trong đóUnion (X, Y, Z) = Union (Union (X, Y), Z)
. Nó đủ dễ dàng để hỗ trợ các loại dữ kèo bóng đá c1 trong đó đây không phải là trường hợp, bằng cách thực hiện thuật toán liên minh thích hợp trong nàyGistPhương pháp hỗ trợ.
Kết quả củaLiên minh
Hàm phải là giá trị của loại lưu trữ của chỉ kèo bóng đá c1, 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 đá c1). TheLiên minh
Hàm sẽ trả một 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,Liên minh
First FirstNội bộ
Đối số thực sự là mộtgistEntryVector
Con trỏ. Đối số thứ hai là một con trỏ tới một biến số nguyên, có thể bị bỏ qua.Liên minh
Hà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 một kèo bóng đá c1 dữ liệu thành một định dạng phù hợp để lưu trữ vật lý trong một trang chỉ kèo bóng đá c1. Nếunén
Phương thức bị bỏ qua, các kèo bóng đá c1 dữ liệu được lưu trữ trong chỉ kèo bóng đá c1 mà không cần sửa đổi.
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_compress (nội bộ)
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);
Bạn phải điều chỉnhnén_data_type
sang loại cụ thể mà bạn đang chuyển đổi để nén các 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 kèo bóng đá c1 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én
Phương pháp 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 đá c1 được lưu trữ. (giải nén
không nhất thiết là mặt trái củanén
Phương pháp; Cụ thể, nếunén
là 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 đá c1 gốc.giải nén
không nhất thiết phải tương đương vớiFetch
, vì các phương thức chính khác có thể không yêu cầu tái cấu trúc dữ kèo bóng đá c1 đầy đủ.)
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_decompress (nội bộ)
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);
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ị cho biếtHồichi phícủa việc chèn kèo bóng đá c1 mới vào một nhánh cụ thể của cây. Các kèo bóng đá c1 sẽ được chèn xuống đường dẫn ít nhấthình phạt
Trong cây. Giá trị được trả về bởihình phạt
nên không âm. Nếu một giá trị âm được trả về, nó sẽ được coi là 0.
TheSQLTuyên bố chức kèo bóng đá c1 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ộ)
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_penalty);
Vì lý do lịch sử,hình phạt
Hàm không chỉ trả vềfloat
Kế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.
Thehình phạt
Hàm rất quan trọng đối với hiệu suất tốt của chỉ kèo bóng đá c1. 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 đá c1 nhập mới vào cây.
picksplit
Khi cần phân chia trang chỉ mục, chức kèo bóng đá c1 này quyết định mục nhập nào trên trang sẽ ở trên trang cũ và sẽ chuyển sang trang mới.
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_picksplit (nội bộ, nội bộ)
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_picksplit);
Lưu ý rằngPickSplit
Kết quả của chức kèo bóng đá c1 được phân phối bằng cách sửa đổi thông quaV
Cấ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
, Thepicksplit
Hàm rất quan trọng đối với hiệu suất tốt của chỉ kèo bóng đá c1. Thiết kế phù hợphình phạt
vàPickSplit
triển khai là nơi thách thức thực hiện hoạt động tốtgistLIES LIES.
cùng
Trả về đúng nếu hai kèo bóng đá c1 chỉ kèo bóng đá c1 giống hệt nhau, sai. (MỘTkèo bóng đá c1 nhập chỉ kèo bóng đá c1là giá trị của loại lưu trữ của chỉ kèo bóng đá c1, không nhất thiết là loại cột được lập chỉ kèo bóng đá c1 gốc.)
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_same (Storage_Type, Storage_Type, Internal)
Và mã phù hợp trong mô -đun C sau đó có thể theo bộ xương này:
pg_function_info_v1 (my_same);
Vì lý do lịch sử,cùng
Hà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.
Khoảng cách
Đã cho kèo bóng đá c1 nhập chỉ kèo bóng đá c1P
và giá trị truy vấnQ
, Hàm này xác định kèo bóng đá c1 nhập của kèo bóng đá c1 nhậpKhoảng cáchxôngTừ 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.Khoả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 đá c1 nhập chỉ số lá, kết quả chỉ thể hiện khoảng cách đến kèo bóng đá c1 nhập chỉ kèo bóng đá c1;
TheSQLTuyên bố chức kèo bóng đá c1 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ộ)
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_distance);
Các đối số choKhoảng cách
Hàm giống hệt với các đối số củanhất quán
chức kèo bóng đá c1.
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 đá c1. 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.*Recheck
Để đú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àfloat8
hoặcfloat4
và các giá trị kết quả của hàm khoảng cách phải tương đương với các 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 kèo bóng đá c1 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, các giá trị kết quả của hàm khoảng cách có thể là bất kỳ hữu hạnfloat8
giá trị, miễn là thứ tự tương đối của các 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ý các trường hợp như nulls, do đóKhoảng cách
Hàm trả về các giá trị này.)
Fetch
Chuyển đổi biểu diễn chỉ kèo bóng đá c1 nén của kèo bóng đá c1 dữ liệu thành kiểu dữ liệu gốc, để quét chỉ có chỉ kèo bóng đá c1. 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 đá c1 ban đầu.
TheSQLTuyên bố chức kèo bóng đá c1 phải trông như thế này:
Tạo hoặc thay thế hàm my_fetch (nội bộ)
Đối số là một con trỏ tớigistEntry
Cấu trúc. Khi nhập cảnh, nóKey
Trường chứa một mốc dữ kèo bóng đá c1 lá không null ở dạng nén. Giá trị trả về là một giá trị khácGistEntry
struct, cóKey
Trường chứa cùng một mốc thời gian ở dạng ban đầu, không nén. Nếu chức kèo bóng đá c1 nén của OPClass không làm gì cho các mục lá, thìFetch
Phương thức có thể trả về đối số as-is. Hoặc, nếu opclass không có chức kèo bóng đá c1 nén,Fetch
Phươ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);
Nếu phương thức nén bị mất cho các kèo bóng đá c1 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 đá c1 và không được xác địnhFetch
chức kèo bóng đá c1.
Tùy chọn
Cho phép định nghĩa các 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 kèo bóng đá c1 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 một con trỏ đến Alocal_relopts
struct, cần được lấp đầy bằng một tập hợp các tùy chọn cụ thể của lớp vận hành. Các tùy chọn có thể được truy cập từ các chức kèo bóng đá c1 hỗ trợ khác bằng cách sử dụngpg_has_opclass_options ()
vàPG_GET_OPCLASS_OPTES ()
macro.
Một ví dụ triển khai my_options () và các tham số sử dụng từ các chức kèo bóng đá c1 hỗ trợ khác được đưa ra dưới đây:
typedef enum myenumtype
Vì biểu diễn khóa tronggistlà linh hoạt, nó có thể phụ thuộc vào các tham số do người dùng chỉ định. Ví dụ, độ dài của chữ ký khóa có thể được chỉ định.gtsVector_options ()
Ví dụ.
Tất cả các phương thức hỗ trợ GIST thường được gọi trong bối cảnh bộ nhớ ngắn; đó là,currentMemoryContext
sẽ đượ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.fcinfo- flinfo- fn_mcxt
, và giữ một 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 đá c1 (ví dụ: một lần quét chỉ kèo bóng đá c1 GIST duy nhất, xây dựng chỉ kèo bóng đá c1 hoặc chèn tăng chỉ số).fn_extra
Giá trị hoặc rò rỉ sẽ tích lũy trong thời gian hoạt động.
Nếu bạn thấy bất cứ điều gì trong tài kèo bóng đá c1 không chính xác, không khớpMẫu nàyĐể báo cáo vấn đề tài kèo bóng đá c1.