2014-03-01 5 views
1

내 네트워크에서 실행되는 대역폭 모니터를 쓰고 있는데, 패킷 메타 데이터 (호스트, 인바운드, 크기 등)가 가득한 데이터베이스가 있고 그래프를 작성해야하는 단계에 도달했습니다. 그것. 내 접근 방식은 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 
+1

당신의 traffic_log_outbound 구조와 데이터의 일부를 넣어주세요. – Houari

+0

및 그 구조 – Houari

+0

@Houari 당신이 원했던 것입니까? –

답변

2

SQL Fiddle

select 
    (extract(epoch from time)/120)::integer, 
    sum(size) as size 
from test 
where 
    ip=inet '192.168.1.69' 
    and 
    time > current_timestamp - interval '24 hours' 
group by 1 
order by 1 
; 
    int4 | size 
----------+------ 
11613921 | 100 
11614273 | 400 
11614276 | 200 
11614278 | 400 
+0

불행히도 나는 왜 그런지 이해하지 못한다. 그러나 이것은 훌륭한 학습 경험을 위해 만들어야합니다. –

관련 문제