Re: Need advice about triggers - Mailing list pgsql-performance

From Mindaugas Riauba
Subject Re: Need advice about triggers
Date
Msg-id 053a01c37785$5f89d4d0$f20214ac@bite.lt
Whole thread Raw
In response to Need advice about triggers  ("Mindaugas Riauba" <mind@bi.lt>)
Responses Re: Need advice about triggers
List pgsql-performance
> >> Well, try it without the trigger. If performance improves markedly, it
> >> might be worth rewriting in C.
>
> >   Nope. Execution time is practically the same without trigger.
>
> >> If not, you're probably saturating the disk I/O -
>
> >   Bottleneck in this case is CPU. postmaster process uses almost 100% of
> > CPU.
>
> That seems very odd.  Updates should be I/O intensive, not CPU
> intensive.  I wouldn't have been surprised to hear of a plpgsql trigger
> consuming lots of CPU, but without it, I'm not sure where the time is
> going.  Can you show us an EXPLAIN ANALYZE result for a typical update
> command?

  Two EXPLAIN ANALYZE below. One is before another is after REINDEX. It
seems
that REINDEX before updates helps. Time went down to ~17s. Also CPU is not
at
100%. vmstat output is below (machine is 2xCPU so 40% load means 80% on one
CPU).

  So the solution would be REINDEX before updates and VACUUM at the same
time?
Without REINDEX performance slowly degrades.

  Mindaugas


router_db=# explain analyze update ifdata set ifspeed=256000,
ifreason='12121', iflastupdate=CURRENT_TIMESTAMP WHERE clientid='#0003904#';
                                                         QUERY PLAN
----------------------------------------------------------------------------
------------------------------------------------
 Index Scan using ifdata_clientid_key on ifdata  (cost=0.00..5.64 rows=1
width=116) (actual time=0.17..0.36 rows=1 loops=1)
   Index Cond: (clientid = '#0003904#'::character varying)
 Total runtime: 1.70 msec
(3 rows)

router_db=# reindex table ifdata;
REINDEX
router_db=# explain analyze update ifdata set ifspeed=256000,
ifreason='12121', iflastupdate=CURRENT_TIMESTAMP WHERE clientid='#0003904#';
                                                         QUERY PLAN
----------------------------------------------------------------------------
------------------------------------------------
 Index Scan using ifdata_clientid_key on ifdata  (cost=0.00..5.65 rows=1
width=116) (actual time=0.06..0.07 rows=1 loops=1)
   Index Cond: (clientid = '#0003904#'::character varying)
 Total runtime: 0.47 msec
(3 rows)

----------------------------------------------------------------------------
---

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0   5048  20616 273556 1614692   0   0     4     3    2     0   0   1
3
 0  0  0   5048  20612 273556 1614692   0   0     0     0  109     8   0   0
100
 0  0  0   5048  20612 273556 1614692   0   0     0   168  144    20   0   0
100
 1  0  0   5048  19420 273556 1614612   0   0     0   192  123  4120  35   2
63
 0  1  1   5048  19420 273572 1614652   0   0     0   672  144  4139  32   2
66
 1  0  0   5048  19420 273580 1614660   0   0     0   360  125  4279  33  12
55
 1  0  0   5048  19420 273580 1614724   0   0     0   272  119  5887  41   2
57
 1  0  0   5048  19420 273580 1614716   0   0     0   488  124  4871  40   1
59


pgsql-performance by date:

Previous
From: Dennis Bjorklund
Date:
Subject: Re: Reading data in bulk - help?
Next
From: "Magnus Naeslund(w)"
Date:
Subject: Re: Reading data in bulk - help?