From: | Ogden <lists(at)darkstatic(dot)com> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | Optimizations |
Date: | 2010-03-05 08:17:04 |
Message-ID: | E3154F41-AC4B-4FD9-9181-6B33857B82E6@darkstatic.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
We run a student scoring system with PostgreSQL as a backend. After the results for each student are inputted into the system, we display many reports for them. We haven't had a problem with efficiency or speed, but it has come up that perhaps storing the rolled up scores of each student may be better than calculating their score on the fly. I have always coded the SQL to calculate on the fly and do not see any benefit from calculating on the fly. For a test with over 100 questions and with 950 students having taken it, it calculates all their relevant score information in less than half a second. Would there be any obvious benefit to caching the results?
I would greatly appreciate any thoughts on this.
Here is the structure:
A database to store and calculate student results.
Information about the student and which test they took:
\d test_registration;
Table "public.test_registration"
Column | Type | Modifiers
---------------------+-----------------------------+------------------------
id | uuid | not null
sid | character varying(36) | not null
created_date | timestamp without time zone | not null default now()
modified_date | timestamp without time zone | not null
test_administration | uuid | not null
The actual results (what the student marked):
\d test_registration_result (linked to test_registration.id above)
Table "public.test_registration_result"
Column | Type | Modifiers
-------------------+-----------------------+-----------
test_registration | uuid | not null
question | uuid | not null
answer | character varying(15) |
\d question (information on each question)
Table "public.question"
Column | Type | Modifiers
-------------------+------------------------+---------------
id | uuid | not null
test | uuid | not null
question | integer | not null
weight | double precision |
\d question_answer (the answers for the question)
Table "public.question_answer"
Column | Type | Modifiers
----------+-----------------------+-----------
question | uuid | not null
answer | character varying(15) | not null
With a SQL query:
SELECT sid, raw_score, weighted_score, number_questions, total_weights,
( weighted_score / total_weights ) * 100.00 as mp_percentage,
total_weights
FROM
(
SELECT
tr.sid as sid,
sum (
(
SELECT (case when a.answer = r.answer then 1 else 0 end )
)
) as raw_score,
sum (
(
SELECT (case when a.answer = r.answer THEN q.weight end )
)
) as weighted_score,
.....
For 953 students on a test with 145 questions, this takes less than half a second to calculate. Is is worth storing the score?
\d score_set
Table "public.score_set"
Column | Type | Modifiers
------------------------+-----------------------------+------------------------
id | uuid | not null
sid | uuid | not null
test_registration_id | uuid | not null
test_administration_id | uuid | not null
score | double precision | not null
Will it be much faster? I know more storage will be needed.
Thank you
Ogden
From | Date | Subject | |
---|---|---|---|
Next Message | Craig Ringer | 2010-03-05 08:26:46 | Re: Optimizations |
Previous Message | Albe Laurenz | 2010-03-05 07:55:31 | Re: ERROR: row is too big: size 8176, maximum size 8160 |