On 13/12/16 03:26, Petr Jelinek wrote:
> On 13/12/16 02:41, Andres Freund wrote:
>> On 2016-12-10 08:48:55 +0100, Petr Jelinek wrote: 
>>
>>> +static List *
>>> +OpenTableList(List *tables)
>>> +{
>>> +   List       *relids = NIL;
>>> +   List       *rels = NIL;
>>> +   ListCell   *lc;
>>> +
>>> +   /*
>>> +    * Open, share-lock, and check all the explicitly-specified relations
>>> +    */
>>> +   foreach(lc, tables)
>>> +   {
>>> +           RangeVar   *rv = lfirst(lc);
>>> +           Relation        rel;
>>> +           bool            recurse = interpretInhOption(rv->inhOpt);
>>> +           Oid                     myrelid;
>>> +
>>> +           rel = heap_openrv(rv, ShareUpdateExclusiveLock);
>>> +           myrelid = RelationGetRelid(rel);
>>> +           /* filter out duplicates when user specifies "foo, foo" */
>>> +           if (list_member_oid(relids, myrelid))
>>> +           {
>>> +                   heap_close(rel, ShareUpdateExclusiveLock);
>>> +                   continue;
>>> +           }
>>
>> This is a quadratic algorithm - that could bite us... Not sure if we
>> need to care.  If we want to fix it, one approach owuld be to use
>> RangeVarGetRelid() instead, and then do a qsort/deduplicate before
>> actually opening the relations.
>>
> 
> I guess it could get really slow only with big inheritance tree, I'll
> look into how much work is the other way of doing things (this is not
> exactly hot code path).
> 

Actually looking at it, it only processes user input so I don't think
it's very problematic in terms of performance. You'd have to pass many
thousands of tables in single DDL to notice.

-- 
  Petr Jelinek                  http://www.2ndQuadrant.com/
  PostgreSQL Development, 24x7 Support, Training & Services


-- 
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