Tại sao bạn lại lập chỉ mục text_potype_ops trên một cột văn bản?


18

Hôm nay, bảy cơ sở dữ liệu trong bảy tuần đã giới thiệu cho tôi các chỉ mục cho mỗi nhà khai thác.

Bạn có thể lập chỉ mục chuỗi cho mẫu khớp với các truy vấn trước đó bằng cách tạo text_pattern_opschỉ mục lớp toán tử, miễn là các giá trị được lập chỉ mục bằng chữ thường.

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);

Chúng tôi sử dụng text_pattern_opsbởi vì tiêu đề là loại văn bản. Nếu bạn cần chỉ số varchars, ký tự, hoặc tên, sử dụng ops liên quan: varchar_pattern_ops, bpchar_pattern_ops, và name_pattern_ops.

Tôi thấy ví dụ thực sự khó hiểu. Tại sao nó hữu ích để làm điều này?

Nếu cột là loại văn bản, các loại khác (varchar, char, name) sẽ được chuyển thành văn bản trước khi được sử dụng làm giá trị tìm kiếm?

Làm thế nào để chỉ mục đó hành xử khác với một sử dụng toán tử mặc định?

CREATE INDEX moves_title_pattern ON movies (lower(title));

1
Câu hỏi liên quan này có thể giúp ích: dba.stackexchange.com/questions/10694/iêng
Erwin Brandstetter

Cảm ơn, Erwin. Câu trả lời của bạn cho câu hỏi đó rất hữu ích khi nghiên cứu các ý tưởng trong cuốn sách.
Iain Samuel McLean Elder

Câu trả lời:


20

Các tài liệu thường cung cấp cho bạn một câu trả lời cho các câu hỏi như vậy. Giống như trong trường hợp này , quá:

Các lớp toán tử text_potype_ops, varchar_potype_ops và bpchar_potype_ops hỗ trợ các chỉ mục cây B trên các loại văn bản, varchar và char tương ứng. Sự khác biệt so với các lớp toán tử mặc định là các giá trị được so sánh nghiêm ngặt theo từng ký tự thay vì theo các quy tắc đối chiếu cụ thể của miền địa phương. Điều này làm cho các lớp toán tử này phù hợp để sử dụng bởi các truy vấn liên quan đến các biểu thức khớp mẫu (biểu thức thông thường THÍCH hoặc POSIX) khi cơ sở dữ liệu không sử dụng ngôn ngữ "C" tiêu chuẩn. Ví dụ, bạn có thể lập chỉ mục một cột varchar như thế này:

CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

Lưu ý rằng bạn cũng nên tạo một chỉ mục với lớp toán tử mặc định nếu bạn muốn các truy vấn liên quan đến <, <=,> hoặc> = so sánh thông thường để sử dụng một chỉ mục. Các truy vấn như vậy không thể sử dụng các lớp toán tử xxx_potype_ops . (Tuy nhiên, so sánh đẳng thức thông thường có thể sử dụng các lớp toán tử này.) Có thể tạo nhiều chỉ mục trên cùng một cột với các lớp toán tử khác nhau.

Các tài liệu tiếp tục nói:

Nếu bạn sử dụng miền địa phương C, bạn không cần các lớp toán tử xxx_potype_ops, bởi vì một chỉ mục với lớp toán tử mặc định có thể sử dụng cho các truy vấn khớp mẫu trong miền C.

Bạn có thể kiểm tra ngôn ngữ của mình như sau (có thể là UTF8 thay vì "C"):

postgres=> show lc_collate;
 lc_collate
-------------
 en_GB.UTF-8

Aha! Tôi đã đọc nó, nhưng thấy nó khó theo dõi nên đã không đưa nó vào. Bạn có nói sự hữu ích của việc text_pattern_opsphụ thuộc vào địa phương không? Có vẻ như nó sẽ có lợi cho tôi vì ngôn ngữ của tôi là 'en_US.UTF-8' (không phải 'C'), vì vậy các truy vấn mẫu không thể sử dụng chỉ mục mặc định.
Iain Samuel McLean Elder

Chính xác. Tôi sẽ thêm (nhưng đây chỉ là suy đoán) rằng với dữ liệu nằm trong các ký tự ASCII cơ bản, lớp toán tử mặc định cũng tốt như vậy - ít nhất tôi thấy các truy vấn với THÍCH 'cái gì đó%' sử dụng các chỉ mục như vậy.
dezso

5
@dezso: Nếu bạn đã thấy một LIKEtruy vấn sử dụng chỉ mục b-cây đơn giản, thì db phải được sử dụng Cmiền địa phương. Hoặc chỉ mục được xác định bằng COLLATE "POSIX"(hoặc COLLATE "C") và truy vấn chỉ định khớp COLLATION. Với bất kỳ đối chiếu nào khác, thứ tự của chỉ mục không khớp với quy tắc miền địa phương và do đó không thể được sử dụng để khớp mẫu.
Erwin Brandstetter

1
@ErwinBrandstetter Tôi phải xác nhận, bạn nói đúng.
dezso

1
@StopHarmingMonica bạn nhận được phản hồi chính xác (và không có lỗi), chỉ cần truy vấn sẽ có thể chậm hơn, không thể sử dụng chỉ mục.
dezso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.