Re: schema/db design wrt performance - Mailing list pgsql-performance

From Ron Johnson
Subject Re: schema/db design wrt performance
Date
Msg-id 1042737892.889.56.camel@haggis
Whole thread Raw
In response to Re: schema/db design wrt performance  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
List pgsql-performance
On Thu, 2003-01-16 at 10:38, Stephan Szabo wrote:
> On 16 Jan 2003, Ron Johnson wrote:
>
> > On Thu, 2003-01-16 at 10:02, Stephan Szabo wrote:
> > > On 16 Jan 2003, Ron Johnson wrote:
> > >
> > > > On Thu, 2003-01-16 at 09:39, Andrew Sullivan wrote:
> > > > > On Thu, Jan 16, 2003 at 08:34:38AM -0600, Ron Johnson wrote:
> > > > > > On Thu, 2003-01-16 at 08:20, Andrew Sullivan wrote:
> > > > >
> > > > > > > If a user has multiple connections and charges things to the same
> > > > > > > account in more than one connection at the same time, the
> > > > > > > transactions will have to be processed, effectively, in series: each
> > > > > > > one will have to wait for another to commit in order to complete.
> > > > > >
> > > > > > This is true even though the default transaction mode is
> > > > > > READ COMMITTED?
> > > > >
> > > > > Yes.  Remember, _both_ of these are doing SELECT. . .FOR UPDATE.
> > > > > Which means they both try to lock the corresponding record.  But they
> > > > > can't _both_ lock the same record; that's what the lock prevents.
> > > >
> > > > Could BEFORE INSERT|UPDATE|DELETE triggers perform the same
> > > > functionality while touching only the desired records, thus
> > > > decreasing conflict?
> > >
> > > It does limit it to the corresponding records, but if you
> > > say insert a row pointing at customer 1, and in another transaction
> > > insert a row pointing at customer 1, the second waits on the first.
> >
> > 2 points:
> >
> > 1. Don't you *want* TXN2 to wait on TXN1?
>
> Not really.  Maybe I was unclear though.
>
> Given
> create table pktable(a int primary key);
> create table fktable(a int references pktable);
> insert into pktable values (1);
>
> The blocking would occur on:
> T1: begin;
> T2: begin;
> T1: insert into fktable values (1);
> T2: insert into fktable values (1);
>
> This doesn't need to block.  The reason for
> the lock is to prevent someone from updating
> or deleting the row out of pktable, but it
> also prevents this kind of thing.  This becomes
> an issue if you say have tables that store mappings
> and a table that has an fk to that.  You'll
> be inserting lots of rows with say
> customertype=7 which points into a table with
> types and they'll block.  Worse, if you say
> do inserts with different customertypes in
> different orders in two transactions you
> can deadlock yourself.

So Postgres will think it's possible that I could modify the
reference table that "customertype=7" refers to?  If so, bummer.

The commercial RDBMS that I use (Rdb/VMS) allows one to specify
that certain tables are only for read access.

For example:
SET TRANSACTION READ WRITE
    RESERVING T_MASTER, T_DETAIL FOR SHARED WRITE,
              T_MAPPING1, T_MAPPING2, T_MAPPING3 FOR SHARED READ;

Thus, only minimal locking is taken out on T_MAPPING1, T_MAPPING2
& T_MAPPING3, but if I try to "UPDATE T_MAPPING1" or reference any
other table, even in a SELECT statement, then the statement will
fail.

Rdb also alows for exclusive write locks:
SET TRANSACTION READ WRITE
    RESERVING T_MASTER, T_DETAIL FOR SHARED WRITE,
              T_MAPPING1, T_MAPPING2, T_MAPPING3 FOR SHARED READ,
              T_FOOBAR FOR EXCLUSIVE WRITE;

Thus, even though there is concurrent access to the other tables,
a table lock on T_FOOBAR is taken out.  This cuts IO usage in 1/2,
but obviously must be used with great discretion.

--
+------------------------------------------------------------+
| Ron Johnson, Jr.     mailto:ron.l.johnson@cox.net          |
| Jefferson, LA  USA   http://members.cox.net/ron.l.johnson  |
|                                                            |
| "Basically, I got on the plane with a bomb. Basically, I   |
|  tried to ignite it. Basically, yeah, I intended to damage |
|  the plane."                                               |
|    RICHARD REID, who tried to blow up American Airlines    |
|                  Flight 63                                 |
+------------------------------------------------------------+


pgsql-performance by date:

Previous
From: "Josh Berkus"
Date:
Subject: Re: 7.3.1 New install, large queries are slow
Next
From: "Josh Berkus"
Date:
Subject: Re: 7.3.1 New install, large queries are slow