At 07:58 AM 5/3/05, [EMAIL PROTECTED] wrote:

Do I have to create another table to put this data???
But, Isn't it redundancy? :-/

The question is: For example:
I have a "clients" table and I have a "taxes" table that is a chield of client.
Is more efficient put fields into client table that contains:
-) the count for paid taxes
-) the count for unpaid taxes
-) the count for all taxes
-) the last tax expiration date
Or is more efficient construct a function that will count this field runtime,
as a view for example, or a simple function.
-) SELECT count(*) from taxes where client=$1 and not nullvalue(dt_pay);
-) SELECT count(*) from taxes where client=$1 and nullvalue(dt_pay);
-) SELECT count(*) from taxes where client=$1;
-) SELECT dt_expiration from taxes where client=$1 order by dt_expiration desc
limit 1;


While having few records in "taxes" table, the function (runtime) work right and
in good time, but when the "taxes" table grows I think the function will run so
slow...
What is correct???
Construct a Function to count runtime? or Create a Trigger to update the
"clients" fields before all action and use those fields in select???


Placing the count fields in client table is redundant and expensive. Creating a function with four selects in it could be slow, but you can obtain those four data items in a single select:

SELECT
    CASE WHEN dt_pay IS NULL THEN 0 ELSE count(*) END AS CountPaidTaxes,
    CASE WHEN dt_pay IS NULL THEN count(*) ELSE 0 END AS CountUnPaidTaxes,
    COUNT(*) AS CountTaxes,
    MAX(dt_expiration) AS LastExpiry
    FROM taxes WHERE client = $1;

With an index on client, this should always be quite speedy. Using "order by dt_expiration desc
limit 1;" is a nice trick, but not useful in this case because all rows for one client are being retrieved anyway for the other three data items.


Frank


---------------------------(end of broadcast)--------------------------- TIP 8: explain analyze is your friend

Reply via email to