On Sat, Jun 16, 2012 at 9:50 AM, Dean Rasheed <dean.a.rash...@gmail.com>wrote:

Then in HEAD:
> EXPLAIN ANALYSE UPDATE fk_table SET b=b+1, c=c+1, d=d+1;
>
>                                                      QUERY PLAN
>
> -----------------------------------------------------------------------------------------------------------------------
>  Update on fk_table  (cost=0.00..2300.00 rows=100000 width=26) (actual
> time=1390.037..1390.037 rows=0 loops=1)
>   ->  Seq Scan on fk_table  (cost=0.00..2300.00 rows=100000 width=26)
> (actual time=0.010..60.841 rows=100000 loops=1)
>  Trigger for constraint fk_table_e_fkey: time=210.184 calls=90000
>  Total runtime: 1607.626 ms
> (4 rows)
>
> So the RI trigger is fired 90000 times, for the unchanged NULL FK rows.
>
> With this patch, the RI trigger is not fired at all:
> EXPLAIN ANALYSE UPDATE fk_table SET b=b+1, c=c+1, d=d+1;
>
>                                                      QUERY PLAN
>
> -----------------------------------------------------------------------------------------------------------------------
>  Update on fk_table  (cost=0.00..2300.00 rows=100000 width=26) (actual
> time=1489.640..1489.640 rows=0 loops=1)
>   ->  Seq Scan on fk_table  (cost=0.00..2300.00 rows=100000 width=26)
> (actual time=0.010..66.328 rows=100000 loops=1)
>  Total runtime: 1489.679 ms
> (3 rows)
>
>
> Similarly, if I update the FK column in HEAD the RI trigger is fired
> for every row:
> EXPLAIN ANALYSE UPDATE fk_table SET e=e-1;
>
>                                                      QUERY PLAN
>
> -----------------------------------------------------------------------------------------------------------------------
>  Update on fk_table  (cost=0.00..1800.00 rows=100000 width=26) (actual
> time=1565.148..1565.148 rows=0 loops=1)
>   ->  Seq Scan on fk_table  (cost=0.00..1800.00 rows=100000 width=26)
> (actual time=0.010..42.725 rows=100000 loops=1)
>  Trigger for constraint fk_table_e_fkey: time=705.962 calls=100000
>  Total runtime: 2279.408 ms
> (4 rows)
>
> whereas with this patch it is only fired for the non-NULL FK rows that
> are changing:
> EXPLAIN ANALYSE UPDATE fk_table SET e=e-1;
>
>                                                      QUERY PLAN
>
> -----------------------------------------------------------------------------------------------------------------------
>  Update on fk_table  (cost=0.00..5393.45 rows=299636 width=26) (actual
> time=1962.755..1962.755 rows=0 loops=1)
>   ->  Seq Scan on fk_table  (cost=0.00..5393.45 rows=299636 width=26)
> (actual time=0.023..52.850 rows=100000 loops=1)
>  Trigger for constraint fk_table_e_fkey: time=257.845 calls=10000
>  Total runtime: 2221.912 ms
> (4 rows)
>

I find it interesting that 'actual time' for top level 'Update on fk_table'
is always higher in patched versions, and yet the 'Total runtime' is lower
for the patched versions. I would've expected 'Total runtime' to be
proportional to the increase in top-level row-source's 'actual time'.

Even the time consumed by Seq scans is higher in patched version, so I
think the patch's affect on performance needs to be evaluated.

Best regards,
-- 
Gurjeet Singh
EnterpriseDB Corporation
The Enterprise PostgreSQL Company

Reply via email to