Phiên bản được hỗ trợ:16 / 15 / 14 / 13
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

64.3. kèo bóng đá c1

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ồiHồi10317_10348Hồi. Tùy thuộc vào cách bạn xác địnhHồibằngHồi, Hồiít hơnHồilớ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ánUnionPhươ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ạ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 đá 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ềVarlenacho 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ọnFetchlà 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é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ử 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 đá c1Pvà 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 qHồ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, ARECHECKCờ 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=SaiSau đó, chỉ kèo bóng đá c1 đã kiểm tra chính xác điều kiện vị ngữ, trong khi nếuRECHECK=TRUEHà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_operatorso 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,Keylà một yếu tố trong chỉ kèo bóng đá c1 vàTruy vấnGiá trị được tra cứu trong chỉ kèo bóng đá c1. TheStrategyNumberTham 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ấncó 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ấnGiá trị đối số sẽ phải phụ thuộc vào toán tử.)nhất quánchứ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 minhHà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 minhHà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 minhFirst FirstNội bộĐối số thực sự là mộtgistEntryVectorCon 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 minhHà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énPhươ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_typesang 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énPhươ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é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 đá c1 gốc.giải nénkhô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ạtTrong cây. Giá trị được trả về bởihình phạtnê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ạ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.

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 đá 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ằngPickSplitKế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 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 đá c1. 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

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ù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.

Khoảng cách

Đã cho kèo bóng đá c1 nhập chỉ kèo bóng đá c1Pvà 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áchHàm giống hệt với các đối số củanhất quánchứ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àfloat8hoặcfloat4và 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ạnfloat8giá 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áchHà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ớigistEntryCấu trúc. Khi nhập cảnh, nóKeyTrườ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ácGistEntrystruct, cóKeyTrườ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ìFetchPhươ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,FetchPhươ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 địnhFetchchứ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_reloptsstruct, 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 ()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à,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.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_extraGiá trị hoặc rò rỉ sẽ tích lũy trong thời gian hoạt động.

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 đá 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.