Excerpts from Florian Pflug's message of vie nov 26 10:48:39 -0300 2010:

> To me, the whole thing seems to be special case of allowing to not only lock 
> whole tuples FOR UPDATE or FOR SHARE, but also individual fields or sets of 
> fields. Except that for simplicity, only two sets are supported, which are
>   A) All fields
>   B) All fields which are included in some unique constraint, including 
> primary keys.
> 
> I'd therefore suggest to extend the FOR SHARE / FOR UPDATE syntax to be 
>   SELECT FOR { SHARE | UPDATE } [ OF <table1>[.<field1>], ... ]
> and obtain what you call a "KEY LOCK" if (for a particular table) the set of 
> fields is a subset of (B). Otherwise, we'd obtain a full SHARE lock. Thus 
> we'd always lock at least the fields the user told us to, but sometimes more 
> than those, for the sake of a more efficient implementation.

This would require some additions in ri_FetchConstraintInfo().  Right
now it does a single syscache lookup and then extracts a bunch of
attributes from there.  If we're going to implement as you suggest, we'd
have to:

1. add a relcache lookup in there, and extract column names involved in
the FK.

2. store those column names in RI_ConstraintInfo; currently it's about
68 bytes, it'd grow to ~2116 bytes (current size plus RI_MAX_NUMKEYS * 
NAMEDATALEN).

Additionally, we'd have to expend some more cycles at the parse analysis
phase (of the "FOR SHARE OF x.col1, x.col2" query) to verify that those
columns belong into some non-partial unique index.


Is the performance gain sufficient to pay these costs?

-- 
Álvaro Herrera <alvhe...@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to