@Tregoreg đưa ra một câu hỏi trong bình luận cho tiền thưởng được cung cấp của mình:
Tôi không tìm thấy câu trả lời hiện tại làm việc. Sử dụng chỉ mục GIN trên cột được gõ mảng không làm tăng hiệu suất của toán tử ANY (). Có thực sự không có giải pháp?
Câu trả lời được chấp nhận của @ Frank cho bạn biết sử dụng toán tử mảng , vẫn đúng cho Postgres 11. Hướng dẫn:
... bản phân phối chuẩn của PostgreSQL bao gồm lớp toán tử GIN cho các mảng, hỗ trợ các truy vấn được lập chỉ mục bằng cách sử dụng các toán tử này:
<@
@>
=
&&
Danh sách đầy đủ các lớp toán tử tích hợp cho các chỉ mục GIN trong phân phối chuẩn có ở đây.
Trong Postgres, các chỉ mục được ràng buộc với các toán tử (được triển khai cho một số loại nhất định), không chỉ các loại dữ liệu hoặc các hàm hoặc bất cứ thứ gì khác. Đó là một di sản từ thiết kế Postgres ban đầu của Berkeley và rất khó thay đổi. Và nó thường hoạt động tốt. Dưới đây là một chủ đề về lỗi pssql với Tom Lane bình luận về điều này.
Một số PostGis chức năng (như ST_DWithin()
) dường như vi phạm hiệu trưởng này, nhưng thực tế không phải vậy. Các chức năng này được viết lại trong nội bộ để sử dụng các toán tử tương ứng .
Biểu thức được lập chỉ mục phải ở bên trái của toán tử. Đối với hầu hết các toán tử ( bao gồm tất cả các trường hợp trên ), trình hoạch định truy vấn có thể đạt được điều này bằng cách lật các toán hạng nếu bạn đặt biểu thức được lập chỉ mục sang phải - với điều kiện là COMMUTATOR
đã được xác định. CácANY
trúc có thể được sử dụng kết hợp với các toán tử khác nhau và bản thân nó không phải là toán tử. Khi được sử dụng như constant = ANY (array_expression)
chỉ mục hỗ trợ =
toán tử trên các phần tử mảng sẽ đủ điều kiện và chúng ta sẽ cần một cổ góp cho = ANY()
. Chỉ số GIN được đưa ra.
Postgres hiện không đủ thông minh để rút ra biểu thức có thể lập chỉ mục GIN từ nó. Để bắt đầu, constant = ANY (array_expression)
là không hoàn toàn tương đương với array_expression @> ARRAY[constant]
. Toán tử mảng trả về lỗi nếu có bất kỳ phần tử NULL nào tham gia, trong khi ANY
cấu trúc có thể xử lý NULL ở hai bên. Và có kết quả khác nhau cho sự không phù hợp kiểu dữ liệu.
Câu trả lời liên quan:
Ngoài ra
Trong khi làm việc với integer
các mảng ( int4
, không int2
hoặc int8
) không có NULL
giá trị (như ví dụ của bạn ngụ ý), hãy xem xét mô-đun bổ sung intarray
, cung cấp các toán tử chuyên biệt, nhanh hơn và hỗ trợ chỉ mục. Xem:
Đối với các UNIQUE
ràng buộc trong câu hỏi của bạn chưa được trả lời: Điều đó được thực hiện với chỉ số btree trên toàn bộ giá trị mảng (như bạn nghi ngờ) và hoàn toàn không giúp tìm kiếm các phần tử . Chi tiết:
jsonb
và sử dụng các chỉ mục? postgresql.org/docs/9.5/static/fifts-json.html và postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING