Có ba cách để có được loại số lượng này, mỗi cách có sự cân bằng của riêng chúng.
Nếu bạn muốn có một số lượng đúng, bạn phải thực hiện câu lệnh SELECT giống như câu lệnh bạn đã sử dụng đối với mỗi bảng. Điều này là do PostgreSQL giữ thông tin hiển thị hàng trong chính hàng đó, chứ không phải ở bất kỳ nơi nào khác, vì vậy mọi số lượng chính xác chỉ có thể tương đối với một số giao dịch. Bạn đang đếm những gì giao dịch đó nhìn thấy vào thời điểm nó thực thi. Bạn có thể tự động điều này để chạy trên mọi bảng trong cơ sở dữ liệu, nhưng có thể bạn không cần mức độ chính xác đó hoặc muốn đợi lâu như vậy.
Cách tiếp cận thứ hai lưu ý rằng bộ thu thập số liệu thống kê theo dõi gần như có bao nhiêu hàng "sống" (không bị xóa hoặc bị lỗi bởi các bản cập nhật sau này) bất kỳ lúc nào. Giá trị này có thể bị lệch đi một chút khi hoạt động nặng, nhưng nhìn chung là một ước tính tốt:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Điều đó cũng có thể cho bạn biết có bao nhiêu hàng đã chết, bản thân nó cũng là một con số thú vị để theo dõi.
Cách thứ ba là lưu ý rằng lệnh ANALYZE hệ thống, được thực thi bởi quá trình autovacuum thường xuyên như PostgreSQL 8.3 để cập nhật thống kê bảng, cũng tính toán ước tính hàng. Bạn có thể lấy cái đó như thế này:
SELECT
nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE
nspname NOT IN ('pg_catalog', 'information_schema') AND
relkind='r'
ORDER BY reltuples DESC;
Rất khó để nói truy vấn nào trong số những truy vấn này tốt hơn để sử dụng. Thông thường, tôi đưa ra quyết định dựa trên việc có thêm thông tin hữu ích mà tôi muốn sử dụng bên trong pg_class hay bên trong pg_stat_user_tables hay không. Đối với mục đích đếm cơ bản chỉ để xem mọi thứ nói chung lớn như thế nào, hoặc phải đủ chính xác.