need general optimization advice

From: will trillich <will(at)serensoft(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: need general optimization advice
Date: 2001-03-07 05:26:25
Message-ID: 20010306232625.A3431@mail.serensoft.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

i've got a school-like setup going (7.0.3potato / debian with
PLPGSQL as the language) and i'm wondering if the seasoned folks
here could shed some light on making this a bit more
responsive--i can see where redundant lookups/updates are made,
but i don't know how to do it in one fell swoop, or if it's
possible to use cursors for this:

table 'ratings' links to tables
course
prof

and 'course' links to
topic

and 'topic' links to
school

also, 'prof' links to
person

and for each of those linked-to tables, i'd like to propagate a
"sum total counter" reflecting the feedback for items in that
table:

professor plum teaches course 'mystery101' at clue-free U.
if student 'scarlet' gives him an 'A' for his excellent
teachings in that course, then

update prof set a=a+1 where id='plum';
update person set a=a+1 where id='plum';
update course set a=a+1 where id='mystery101';
update topic set a=a+1 where id='mystery';
update school set a=a+1 where id='clue-free U';

but of course it's not that straightforward, since the tables
inter-link:

<given profID>
<given courseID>
select id into topicID from topic
where course.id=courseID and course.topic=topic.id;
select id into schoolID from school
where topic.id=topicID and topic.school=school.id;
select id into personID from person
where prof.id=profID and prof.person=person.id;
update course set a=a+1 where id=courseID;
update topic set a=a+1 where id=topicID;
update school set a=a+1 where id=schoolID;
update prof set a=a+1 where id=profID;
update person set a=a+1 where id=personID;

i'm thinking: okay, since the WHERE lookups already positioned
some row pointer (cursor?) right where we want it, can we just
use that pointer without having to iterate through another WHERE
clause in the update?

<given profID>
<given courseID>
update course set a=a+1
where id=courseID;
update topic set a=a+1
where course.id=courseID and course.topic=topic.id;

-- since school is two links away, we need this mess:
update school set a=a+1
where course.id=courseID and course.topic=topic.id
and topic.school=school.id;
-- and that double-lookup is costly!

update prof set a=a+1
where id=profID;
update person set a=a+1
where prof.id=profID and prof.person=person.id;

the way it is now, each additional record that gets added to the
ratings table, takes an EXPONENTIALLY longer time to insert, as a
result.

any optimizability suggestions? (maybe keep some date/time stamp
field in another table and propagate these kinds of things after
hours?)

--
It is always hazardous to ask "Why?" in science, but it is often
interesting to do so just the same.
-- Isaac Asimov, 'The Genetic Code'

will(at)serensoft(dot)com
http://newbieDoc.sourceforge.net/ -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!

Browse pgsql-general by date

  From Date Subject
Next Message Richard Huxton 2001-03-07 07:24:48 Re: Why are tables sizes so big?
Previous Message Tom Lane 2001-03-07 04:12:58 Re: Temporary sorting space