PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tác động hiệu suất của LIKE trống trong một tuyên bố đã chuẩn bị

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kiểm tra phiên bản PostgreSQL

  2. Postgresql:Tính thứ hạng theo số mệnh đề HOẶC đúng

  3. Sử dụng các hàm Postgres JSON trên các cột của bảng

  4. PostgreSQL tạo một cột mới với các giá trị được điều chỉnh trên các cột khác

  5. Thứ tự sắp xếp chuỗi (LC_COLLATE và LC_CTYPE)