2012-12-11 26 views
7

Tôi đã tạo toán tử so sánh văn bản có sử dụng thứ tự tự nhiên ('1' < '2' < '10' < '11' vv), sử dụng toán tử mới #<#, #<=#, #>##>=#.Tạo lớp toán tử cho đối sánh mẫu như text_pattern_ops

Bây giờ tôi đặt chúng vào một lớp học hành để có thể tạo ra một chỉ mục trên họ, như thế này:

CREATE OPERATOR CLASS text_natsort_ops 
    FOR TYPE text USING btree AS 
    OPERATOR 1 #<#, 
    OPERATOR 2 #<=#, 
    OPERATOR 3 =, 
    OPERATOR 4 #>=#, 
    OPERATOR 5 #>#, 
    FUNCTION 1 bttext_natsort_cmp(text, text); 

Tuy nhiên, khi tôi tạo ra một chỉ số sử dụng tôi mới text_natsort_ops, điều này không được sử dụng trong các truy vấn liên quan đến like vì nó được thực hiện khi sử dụng text_pattern_ops.

Làm cách nào để khai báo lớp nhà điều hành của mình để cho phép like sử dụng chỉ mục của tôi?

UPDATE:

này dường như trên để làm việc, vì vậy câu hỏi là không hợp lệ. Vấn đề thực sự của tôi là tôi sử dụng một truy vấn như:

select * 
    from mytable 
where number like 'edi%' 
order by number using #<# 
limit 10 

và tôi cũng đã có chỉ số khác sử dụng text_pattern_ops, được chọn bằng các kế hoạch bởi vì nó dường như làm việc nhanh hơn nhiều. Tuy nhiên, vì chỉ số order by ... using chỉ sử dụng các ops mới của tôi sẽ hữu ích ... chỉ số khác trả về quá nhiều kết quả, và tôi cần mệnh đề giới hạn để có sẵn cho việc quét chỉ mục.

+2

Bạn nên đăng cập nhật của mình dưới dạng câu trả lời, vì vậy, câu hỏi này không ẩn chứa thành "chưa được trả lời". –

Trả lời

0

Ở trên dường như hoạt động, vì vậy câu hỏi không hợp lệ. Vấn đề thực sự của tôi là tôi đã sử dụng truy vấn như:

select * 
    from mytable 
where number like 'edi%' 
order by number using #<# 
limit 10 

và tôi cũng có một chỉ mục khác bằng cách sử dụng text_pattern_ops, được chọn bởi trình hoạch định vì nó có vẻ hoạt động nhanh hơn nhiều. Tuy nhiên, do thứ tự bằng ... chỉ sử dụng chỉ mục sử dụng các ops mới của tôi sẽ hữu ích ... chỉ số khác trả về quá nhiều kết quả, và tôi cần mệnh đề giới hạn để có sẵn cho việc quét chỉ mục.

0

Tôi không nghĩ điều này là có thể. Bạn phải suy nghĩ về những gì bạn đang làm và tại sao điều này sẽ không hoạt động. Hoặc bạn sẽ có một chỉ mục hỗ trợ tìm kiếm tiền tố hoặc một cái gì đó hỗ trợ tìm kiếm phạm vi số tự nhiên. Bạn không thể có một chỉ số btree hỗ trợ cả hai.

xem xét cái gì đó như:

SELECT * FROM foo 
WHERE bar like '10%' 
ORDER BY bar USING #>#; 

Vấn đề của bạn là hai chỉ số của bạn sẽ không có một trật tự mà sẽ phù hợp. Chỉ mục sử dụng với LIKE sẽ là 101, 101000, 101001, v.v. trong khi chỉ mục cho đơn đặt hàng của bạn sẽ là 10, 11, 12, 13 ... 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, ...

Vì yêu cầu đặt hàng của bạn yêu cầu thứ tự tìm kiếm khác nhau nên không có cách nào để sử dụng cùng một chỉ mục cho cả hai. Tại một số thời điểm nếu PostgreSQL cho phép tìm kiếm các chỉ mục vật lý của các chỉ mục, điều này có thể trở thành có thể nhưng miễn là các chỉ mục là thứ tự hợp lý, tôi không nghĩ rằng điều này có thể hoạt động.

2

Hãy nhìn vào phần mở rộng PostgreSQL Prefix tại https://github.com/dimitri/prefix Họ cũng xác định riêng của họ HÀNH CLASS và nói với PostgreSQL sử dụng chỉ số GIST đặc biệt đối với các nhà khai thác nhất định, Có lẽ bạn cần một cái gì đó tương tự?

CREATE OPERATOR CLASS gist_prefix_range_ops DEFAULT FOR TYPE prefix_range USING gist ... 
Các vấn đề liên quan