Re: Update performance ... is 200, 000 updates per hour what I should expect?

From: Greg Stark <gsstark(at)mit(dot)edu>
To: Erik Norvelle <erik(at)norvelle(dot)net>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Update performance ... is 200, 000 updates per hour what I should expect?
Date: 2003-12-02 16:40:51
Message-ID: 87u14j9nqk.fsf@stark.dyndns.tv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Erik Norvelle <erik(at)norvelle(dot)net> writes:

> Here's the query I am running:
> update indethom
> set query_counter = nextval('s2.query_counter_seq'), -- Just for keeping track of how fast the query is running
> sectref = (select clavis from s2.sectiones where
> s2.sectiones.nomeoper = indethom.nomeoper
> and s2.sectiones.refere1a = indethom.refere1a and s2.sectiones.refere1b = indethom.refere1b
> and s2.sectiones.refere2a = indethom.refere2a and s2.sectiones.refere2b = indethom.refere2b
> and s2.sectiones.refere3a = indethom.refere3a and s2.sectiones.refere3b = indethom.refere3b
> and s2.sectiones.refere4a = indethom.refere4a and s2.sectiones.refere4b = indethom.refere4b);
>
> Here´s the query plan:
> QUERY PLAN
> -------------------------------------------------------------------------------------
> Seq Scan on indethom (cost=0.00..1310352.72 rows=10631972 width=212)
> SubPlan
> -> Index Scan using sectiones_ndx on sectiones (cost=0.00..6.03 rows=1 width=4)
> Index Cond: ((nomeoper = $0) AND (refere1a = $1) AND (refere1b = $2) AND (refere2a = $3) AND (refere2b = $4) AND (refere3a = $5) AND (refere3b = $6) AND (refere4a = $7) AND (refere4b = $8))
> (4 rows)

Firstly, you might try running "vacuum full" on both tables. If there are tons
of extra dead records that are left-over they could be slowing down the
update.

This isn't the fastest possible plan but it's pretty good.

You might be able to get it somewhat faster using the non-standard "from"
clause on the update statement.

update indethom
set sectref = clavis
from sectiones
where sectiones.nomeoper = indethom.nomeoper
and sectiones.refere1a = indethom.refere1a
and sectiones.refere1b = indethom.refere1b
and sectiones.refere2a = indethom.refere2a
and sectiones.refere2b = indethom.refere2b
and sectiones.refere3a = indethom.refere3a
and sectiones.refere3b = indethom.refere3b
and sectiones.refere4a = indethom.refere4a
and sectiones.refere4b = indethom.refere4b

This might be able to use a merge join which will take longer to get started
because it has to sort both tables, but might finish faster.

You might also try just paring the index down to just the two or three most
useful columns. Is it common that something matches refere1a and refere1b but
doesn't match the remaining? A 8-column index is a lot of overhead. I'm not
sure how much that effects lookup times but it might be substantial.

--
greg

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Robert Treat 2003-12-02 17:16:21 Re: A question on the query planner
Previous Message Tom Lane 2003-12-02 16:32:31 Re: Update performance ... is 200, 000 updates per hour what I should expect?