playing with timestamp entries - Mailing list pgsql-general

From Dale Walker
Subject playing with timestamp entries
Date
Msg-id 3AE74047.D5CCF0A4@icr.com.au
Whole thread Raw
Responses Re: playing with timestamp entries
List pgsql-general

I record our radius logs in a firly basic table, schema is as follows:
----------------------------------------------------------
CREATE TABLE "history_new" (
        "username" character varying(50) NOT NULL,
        "time_stamp" int4 NOT NULL,
        "acctstatustype" character varying(8) NOT NULL ,
        "acctdelay" int2 NOT NULL,
        "acctinputoctets" int4 ,
        "acctoutputoctets" int4 ,
        "acctsessionid" character varying(30),
        "acctsessiontime" int4 ,
        "acctterminatecause" character varying(50),
        "nasidentifier" character varying(22),
        "nasport" character varying(4),
        "framedipaddress" character varying(16),
        "callingstationid" character varying(16),
        "ascenddatarate" character varying(16),
        "calledstationid" character varying(16)
);
-----------------------------------------------------------

I then create an index on the username column by:

---------------------------------------
CREATE INDEX "i_h_uh" on HISTORY using hash (username);
---------------------------------------

I use the 'hash' type as queries regarding usage will always be of the
form "select ...... where username='xxx';"

I also calculate a 'summary' in the form of a table I call sumlog:

-----------------------------------------------------------
CREATE TABLE "sumlog" (
        "username" character varying(8) NOT NULL,
        "period" character varying(8) NOT NULL,
        "sumtime" int4 DEFAULT '0' ,
        "mbup" float8 DEFAULT '0.0' ,
        "mbdn" float8 DEFAULT '0.0' );
------------------------------------------------------------

This table is populated by the following query:
-----------------------------------------------------
insert into sumlog
    select  s.username,
                to_char(timestamp(h.time_stamp),'YYYY-MM') as date,
                sum(h.acctsessiontime),
                sum(float8(h.acctinputoctets)/1000000),
                sum(float8(h.acctoutputoctets)/1000000)
        from subscribers as s,history as h
    where s.username=h.username
    group by s.username,date;
-----------------------------------------------------------

This works fine, but as the database size is constantly growing the
summary table takes a while to calculate...

I was thinking of doing the following:
    1. only update 'sumlog' for the current period (eg. 2001-04)
    2. adding an index on the timestamp column to speed-up the query for
the insert into sumlog.


My questions are:
    1. is it possible to create an index entry on the function applied to
the time_stamp.
        eg. something of the form [ create index "i_ts" on history
(to_char(timestamp(h.time_stamp),'YYYY-MM')) ]
    2. what is the best way to access the data from the history table for a
known period..
        eg. knowing period='2001-04' is there a better function to use than
'to_char' against the timestamp, any sort of indexing I should use,
etc...

I've been going around in circles, and I'm sure I've missed some
basic/common-sense sort of step, but now I'm running out of time to
spend on it....

Has anyone here done anything similar??


--
Dale Walker < dale@icr.com.au >
Independent Computer Retailers (ICR) Pty Ltd
http://www.icr.com.au/

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: Performance: sql functions v. plpgsql v. plperl
Next
From: "Gyozo Papp"
Date:
Subject: Re: Joined table view - multiple delete action rule