Điều nào sau đây là chính xác hơn?
select numbackends from pg_stat_database;
select count(*) from pg_stat_activity;
Điều nào sau đây là chính xác hơn?
select numbackends from pg_stat_database;
select count(*) from pg_stat_activity;
Câu trả lời:
Hai yêu cầu không tương đương. Phiên bản tương đương của phiên bản đầu tiên sẽ là:
SELECT sum(numbackends) FROM pg_stat_database;
Trong trường hợp đó, tôi hy vọng phiên bản đó sẽ nhanh hơn một chút so với phiên bản thứ hai, đơn giản vì nó có ít hàng hơn để đếm. Nhưng bạn không có khả năng đo lường sự khác biệt.
Cả hai truy vấn đều dựa trên cùng một dữ liệu, vì vậy chúng sẽ chính xác như nhau.
Các truy vấn sau đây rất hữu ích
select * from
(select count(*) used from pg_stat_activity) q1,
(select setting::int res_for_super from pg_settings where name=$$superuser_reserved_connections$$) q2,
(select setting::int max_conn from pg_settings where name=$$max_connections$$) q3;
Họ chắc chắn có thể cho kết quả khác nhau. Cái tốt hơn là
select count(*) from pg_stat_activity;
Đó là bởi vì nó bao gồm các kết nối đến các quy trình của người gửi WAL được coi là kết nối thông thường và được tính vào max_connections
.
Xem max_wal_senders
Số lượng kết nối TCP sẽ giúp bạn. Hãy nhớ rằng nó không dành cho một cơ sở dữ liệu cụ thể
netstat -a -n | find /c "127.0.0.1:13306"
Từ việc xem mã nguồn, có vẻ như truy vấn pg_stat_database cung cấp cho bạn số lượng kết nối đến cơ sở dữ liệu hiện tại cho tất cả người dùng. Mặt khác, truy vấn pg_stat_activity chỉ cung cấp số lượng kết nối đến cơ sở dữ liệu hiện tại cho người dùng truy vấn.