Обсуждение: optimyzing
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
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