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

ĐẶT HÀNG ĐƯỢC lập chỉ mục theo LIMIT 1

Giả sử chúng ta đang xử lý một bảng lớn , một chỉ mục một phần có thể giúp:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

Như bạn đã phát hiện ra:giảm dần hoặc tăng dần hầu như không quan trọng ở đây. Postgres có thể quét ngược với tốc độ gần như tương tự (áp dụng ngoại lệ với các chỉ số nhiều cột).

Truy vấn sử dụng chỉ mục này:

SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

Vấn đề ở đây là làm cho chỉ mục nhỏ hơn nhiều , do đó, bộ nhớ cache và bảo trì sẽ dễ dàng hơn.

  1. Bạn cần chọn một dấu thời gian được đảm bảo là nhỏ hơn dấu thời gian gần đây nhất.
  2. Thỉnh thoảng, bạn nên tạo lại chỉ mục để loại bỏ dữ liệu cũ.
  3. Điều kiện cần phải là IMMUTABLE .

Vì vậy, hiệu quả một lần sẽ giảm dần theo thời gian. Sự cố cụ thể là điều kiện được mã hóa cứng:

WHERE created_at > '2013-09-15 0:0'::timestamp

Tự động hóa

Thỉnh thoảng, bạn có thể cập nhật chỉ mục và các truy vấn của mình theo cách thủ công. Hoặc bạn tự động hóa nó với sự trợ giúp của một chức năng như sau:

CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

Chỉ mục:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

Truy vấn:

SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

Tự động hóa giải trí với một công việc cron hoặc một số sự kiện dựa trên trình kích hoạt. Các truy vấn của bạn có thể giữ nguyên ngay bây giờ. Nhưng bạn cần tạo lại tất cả các chỉ số sử dụng chức năng này theo bất kỳ cách nào sau khi thay đổi nó. Chỉ cần thả và tạo từng cái.

Đầu tiên ..

... kiểm tra xem bạn có đang thực sự đập vào cổ chai với cái này hay không.

Thử xem một chỉ mục DROP index ... ; CREATE index ... Làm công việc. Sau đó, chỉ mục của bạn có thể đã bị phình ra. Cài đặt autovacuum của bạn có thể bị tắt.

Hoặc thử VACUUM FULL ANALYZE để có được toàn bộ bảng của bạn cùng với các chỉ số ở tình trạng nguyên sơ và kiểm tra lại.

Các tùy chọn khác bao gồm các chỉ mục bao gồm và điều chỉnh hiệu suất chung thông thường, tùy thuộc vào những gì bạn thực sự truy xuất từ ​​bảng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ruby on Rails:Có cách nào để kéo các mục từ cơ sở dữ liệu và chúng được trả về theo thứ tự đã chỉ định không?

  2. Đơn giản hóa trường hợp lồng nhau khi câu lệnh

  3. Làm cách nào để làm cho Java và Postgres enums hoạt động cùng nhau để cập nhật?

  4. 2 cách trả về hàng chỉ chứa ký tự chữ và số trong PostgreSQL

  5. ECONNREFUSED cho Postgres trên nodeJS với dockers