Postgres 9.2 trở lên nói chung là đủ thông minh để nhận ra rằng điều kiện
WHERE name LIKE '%%'
không có tính chọn lọc và sử dụng quá trình quét tuần tự bỏ qua chỉ mục GiST - ngay cả với các câu lệnh đã chuẩn bị. Bạn làm Tuy nhiên, phải trả một cái giá nhỏ cho tình trạng vô dụng.
Trong Postgres 9.1 hoặc trước đó, tôi sẽ tạo một truy vấn riêng cho trường hợp đặc biệt.
So sánh Ghi chú phần cho PREPARE
tuyên bố trong sách hướng dẫn cho các phiên bản 9.1
, 9.2
và 9.3
.
Xác minh bản thân
Chuẩn bị câu lệnh và chạy EXPLAIN ANALYZE
để kiểm tra:
PREPARE plan1 (text) AS
SELECT * FROM file
WHERE name LIKE $1;
EXPLAIN ANALYZE EXECUTE plan1('%123%');
EXPLAIN ANALYZE EXECUTE plan1('%%');
Các kế hoạch thường được lưu vào bộ nhớ đệm trong suốt thời gian của phiên.
Truy vấn thay thế
Bất kể phiên bản bạn đang chạy là gì, nếu bạn luôn thực hiện tìm kiếm toàn văn bản (ký tự đại diện trái và phải), truy vấn này sẽ nhanh hơn đối với một câu lệnh đã chuẩn bị:
SELECT * FROM files WHERE name LIKE ('%' || $1 || '%');
Và chuyển mẫu mà không cần thêm ký tự đại diện (%
), tất nhiên rồi. Bằng cách này, Postgres biết mong đợi một mẫu nằm trong các ký tự đại diện tại thời điểm lập kế hoạch.
-> Bản trình diễn SQLfiddle.
Lưu ý việc quét tuần tự để tìm LIKE trống và sự khác biệt về hiệu suất giữa hai gói.
SQLfiddle thay đổi rất nhiều, tùy thuộc vào tải, v.v. Một lần chạy có thể không đáng tin cậy. Kiểm tra tốt hơn trong môi trường của bạn và chạy mỗi câu lệnh một vài lần để bão hòa bộ nhớ cache và loại bỏ nhiễu.