Truy vấn đúng để có được số lượng kết nối hiện tại trong DB PostgreSQL


Câu trả lời:


226

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.


1
Không đúng họ đều chính xác như nhau. Xem câu trả lời của tôi.
gargii

2
Lưu ý rằng khi công cụ dòng lệnh postgres, PSQL được sử dụng để thực hiện truy vấn này, tổng số kết nối là kết quả của truy vấn này - 1 do kết nối psql được tạo cũng được bao gồm dưới dạng kết nối
neonidian 13/12/19

25

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;

2
bạn có thể giải thích các cột 'được sử dụng' và 'res_for_super' không?
đặt cược

Xin chào, được sử dụng là kết nối được sử dụng, res_for_super là các kết nối dành riêng cho truy cập siêu người dùng
tbo

12

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


2

Tổng hợp tất cả các phiên postgres theo trạng thái của họ (bao nhiêu là không hoạt động, bao nhiêu làm gì đó ...)

select state, count(*) from pg_stat_activity  where pid <> pg_backend_pid() group by 1 order by 1;

0

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"

1
Nhận xét này là dành cho hệ điều hành Windows. Đối với Linux, nó có thể là một cái gì đó như sau: lsof -Pni: 5432 | fgrep ">" | fgrep -i thành lập | wc -l
XXL

3
Đây không phải là truy vấn SQL, vui lòng không thêm tiếng ồn vào các câu hỏi cụ thể.
bugmenot123

-3

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.


1
Điều đó không chính xác. pg_stat_activity cũng cung cấp tất cả các kết nối, bất kể người dùng. Sau đó, nó cung cấp cho bạn một trường cho biết đó là người dùng nào, mà bạn có thể lọc nếu bạn muốn. Nó sẽ không cung cấp cho bạn văn bản của truy vấn nếu bạn không phải là cùng một người dùng hoặc siêu người dùng, nhưng nó vẫn sẽ hiển thị kết nối.
Magnus Hagander

3
Bạn đúng. Tôi đã không nhìn kỹ đủ vào định nghĩa xem. Hạn chế đối với userid chỉ dành cho việc tham gia chống lại pg_authid. Lỗi của tôi.
Brian L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.