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

Cách tốt nhất để tính kết quả trước khi LIMIT được áp dụng

SQL thuần túy

Mọi thứ đã thay đổi kể từ năm 2008. Bạn có thể sử dụng hàm cửa sổ để nhận đầy đủ kết quả giới hạn trong một truy vấn. Được giới thiệu với PostgreSQL 8.4 vào năm 2009.

SELECT foo
     , count(*) OVER() AS full_count
FROM   bar
WHERE  <some condition>
ORDER  BY <some col>
LIMIT  <pagesize>
OFFSET <offset>;

Lưu ý rằng điều này có thể đắt hơn đáng kể so với khi không có tổng số . Tất cả các hàng phải được tính và một phím tắt khả thi chỉ lấy các hàng trên cùng từ chỉ mục phù hợp có thể không hữu ích nữa.
Không quan trọng lắm với các bảng nhỏ hoặc full_count <=OFFSET + LIMIT . Vấn đề đối với full_count lớn hơn đáng kể .

Trường hợp góc :khi OFFSET ít nhất bằng số hàng từ truy vấn cơ sở, không có hàng Được trả lại. Vì vậy, bạn cũng không nhận được full_count . Có thể thay thế:

  • Chạy truy vấn với LIMIT / OFFSET và cũng nhận được tổng số hàng

Chuỗi sự kiện trong SELECT truy vấn

(0. CTE được đánh giá và cụ thể hóa một cách riêng biệt. Trong Postgres 12 trở lên, người lập kế hoạch có thể nội dòng những thứ như truy vấn con trước khi bắt đầu làm việc.) Không có ở đây.

  1. WHERE mệnh đề (và JOIN , mặc dù không có điều kiện nào trong ví dụ của bạn) lọc các hàng đủ điều kiện từ (các) bảng cơ sở. Phần còn lại dựa trên tập hợp con đã lọc.

(2. GROUP BY và các hàm tổng hợp sẽ ở đây.) Không phải ở đây.

(3. SELECT khác biểu thức danh sách được đánh giá, dựa trên các cột được nhóm / tổng hợp.) Không có ở đây.

  1. Các chức năng của cửa sổ được áp dụng tùy thuộc vào OVER mệnh đề và đặc tả khung của hàm. count(*) OVER() đơn giản dựa trên tất cả các hàng đủ điều kiện.

  2. ORDER BY

(6. DISTINCT hoặc DISTINCT ON sẽ đến đây.) Không phải ở đây.

  1. LIMIT / OFFSET được áp dụng dựa trên thứ tự đã thiết lập để chọn các hàng để trả lại.

LIMIT / OFFSET ngày càng trở nên kém hiệu quả với số lượng hàng ngày càng tăng trong bảng. Xem xét các phương pháp tiếp cận thay thế nếu bạn cần hiệu suất tốt hơn:

  • Tối ưu hóa truy vấn với OFFSET trên bảng lớn

Các lựa chọn thay thế để tính tổng số cuối cùng

Có các cách tiếp cận hoàn toàn khác nhau để tính số hàng bị ảnh hưởng ( không số lượng đầy đủ trước OFFSET &LIMIT Đã được áp dụng). Postgres có sổ sách kế toán nội bộ có bao nhiêu hàng bị ảnh hưởng bởi lệnh SQL cuối cùng. Một số ứng dụng khách có thể truy cập thông tin đó hoặc tự đếm các hàng (như psql).

Ví dụ:bạn có thể truy xuất số hàng bị ảnh hưởng trong plpgsql ngay sau khi thực hiện một lệnh SQL với:

GET DIAGNOSTICS integer_var = ROW_COUNT;

Chi tiết trong sách hướng dẫn.

Hoặc bạn có thể sử dụng pg_num_rows bằng PHP . Hoặc các chức năng tương tự trong các ứng dụng khách khác.

Có liên quan:

  • Tính số hàng bị ảnh hưởng bởi truy vấn hàng loạt trong PostgreSQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi một ngày thành ngày Julian trong PostgreSQL

  2. postgresql di chuyển JSON sang JSONB

  3. Làm thế nào để chuyển đổi kiểu jsonb của PostgreSQL 9.4 thành float

  4. Tổng hợp kết nối cơ sở dữ liệu công nhân cần tây

  5. Cách tạo cơ sở dữ liệu PostgreSQL