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 đủ và 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.
-
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.
-
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. -
ORDER BY
(6. DISTINCT
hoặc DISTINCT ON
sẽ đến đây.) Không phải ở đây.
-
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