Thread: optimyzing

optimyzing

From
Mathieu Arnold
Date:
Hi

I was wondering if it could be possible to optimise such a query :

select avg(traffic) AS avg
from (select   date(time),   sum(traffic) / 1024 / 86400  AS traffic  FROM stats  WHERE ip = '212.43.217.66' AND
date(time)< date('now')  GROUP BY date(time) ) AS subselect
 

having :                  Table "stats"Column  |            Type             | Modifiers
---------+-----------------------------+-----------ip      | inet                        | not nulltime    | timestamp
withouttime zone | not nullpacket  | bigint                      | not nulltraffic | bigint                      | not
null

I have a cron which fills this table every X minute with the total traffic 
by ip for this period.

the subselect gives me the average traffic for an IP by day (in KB/s) :
   date    |    traffic
------------+----------------2002-03-25 | 988.79816880972002-03-26 | 961.15854843702002-03-27 |
984.36130754262002-03-28| 912.57711450652002-03-29 | 885.42811841052002-03-30 | 800.65096134892002-03-31 |
673.6354859190

and I can't get a query to have the average of that without having to do
this subselect.
     avg
----------------886.6585292820

and if it is useful :

Aggregate  (cost=1366.11..1366.11 rows=1 width=16) ->  Subquery Scan subselect  (cost=1365.34..1366.07 rows=15
width=16)      ->  Aggregate  (cost=1365.34..1366.07 rows=15 width=16)             ->  Group  (cost=1365.34..1365.71
rows=146width=16)                   ->  Sort  (cost=1365.34..1365.34 rows=146 width=16)                         ->
IndexScan using stats_ip on stats 
 
(cost=0.00..1360.07 rows=146 width=16)

-- 
Mathieu Arnold


Re: optimyzing

From
Masaru Sugawara
Date:
On Mon, 01 Apr 2002 19:14:57 +0200
Mathieu Arnold <mat@mat.cc> wrote:

> and I can't get a query to have the average of that without having to do
> this subselect.
> 
>       avg
> ----------------
>  886.6585292820
> 


It seems to me that the query can be rewritten without a sub-query,
even though the number of sampling per day is not always kept 
at a constant value.

  SELECT SUM(traffic)::float / COUNT(DISTINCT date(time))::float                       / 1024.0 / 86400.0 AS avg
FROM  stats  WHERE  ip = '212.43.217.66' AND date(time) < date('now')
 


Regards,
Masaru Sugawara