내 네트워크에서 실행되는 대역폭 모니터를 쓰고 있는데, 패킷 메타 데이터 (호스트, 인바운드, 크기 등)가 가득한 데이터베이스가 있고 그래프를 작성해야하는 단계에 도달했습니다. 그것. 내 접근 방식은 2 분 동안 패킷 크기의 합계를 취하고 해당 기간의 평균 비트 전송률을 제공하기 위해 120으로 나눈 그래프를 만든 다음 24 시간 내에 2 분 간격으로이를 반복합니다. 처음에는PostgreSQL에서 일련의 기간의 열을 어떻게 구해야합니까?
SELECT SUM(size)
FROM traffic_log_outbound
WHERE ip=INET '192.168.1.105'
AND time BETWEEN TIMESTAMP 'now' - INTERVAL '1402 minute'
AND TIMESTAMP 'now' - INTERVAL '1400 minute'
과 같은 720 개의 별도 쿼리를 사용하여 구현했으나 완료하는 데 약 400 초가 걸렸습니다.
샘플은 traffic_log_outbound
입니다. 동일한 구조를 가진 또 다른 테이블이 있습니다 (traffic_log_inbound
).
bandwidth_monitor=# SELECT * FROM traffic_log_outbound LIMIT 5;
time | ip | proto | src_port | dst_port | size
----------------------------+---------------+-------+----------+----------+------
2014-03-01 19:51:26.851858 | 192.168.1.225 | 6 | 49365 | 80 | 40
2014-03-01 19:51:26.851907 | 192.168.1.225 | 6 | 49365 | 80 | 377
2014-03-01 19:51:26.851919 | 192.168.1.225 | 6 | 49343 | 80 | 40
2014-03-01 19:51:26.853556 | 192.168.1.225 | 6 | 55492 | 443 | 40
2014-03-01 19:51:26.855605 | 192.168.1.225 | 6 | 55492 | 443 | 40
(5 rows)
그리고 구조
bandwidth_monitor=# \d+ traffic_log_outbound
Table "public.traffic_log_outbound"
Column | Type | Modifiers | Storage | Stats target | Description
----------+-----------------------------+-----------+---------+--------------+-------------
time | timestamp without time zone | | plain | |
ip | inet | | main | |
proto | integer | | plain | |
src_port | integer | | plain | |
dst_port | integer | | plain | |
size | integer | | plain | |
Check constraints:
"traffic_log_outbound_ip_check" CHECK (ip << '192.168.1.0/24'::inet)
Has OIDs: no
당신의 traffic_log_outbound 구조와 데이터의 일부를 넣어주세요. – Houari
및 그 구조 – Houari
@Houari 당신이 원했던 것입니까? –