Double linking MemoryContext children

From: Jan Wieck <jan(at)wi3ck(dot)info>
To: PostgreSQL Development <pgsql-hackers(at)postgresql(dot)org>
Subject: Double linking MemoryContext children
Date: 2015-09-11 13:33:40
Message-ID: 55F2D834.8040106@wi3ck.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

The attached script demonstrates an O(N^2) problem we recently became
aware of. The script simply executes a large anonymous code block that
doesn't do anything useful. Usage is

./t1.py [NUM_STMTS] | psql [DBNAME]

NUM_STMTS defaults to 20,000. The code block executes rather fast, but
the entire script runs for over a minute (at 20,000 statements) on a
2.66 GHz Xeon.

The time is spent when all the prepared SPI statements are freed at the
end of execution. All prepared SPI statements are children of the Cache
context. MemoryContext children are a single linked list where new
members are inserted at the head. This works best when children are
created and destroyed in a last-in-first-out pattern. SPI however
destroys the SPI statements in the order they were created, forcing
MemoryContextSetParent() to traverse the entire linked list for each child.

The attached patch makes MemoryContext children a double linked list
that no longer needs any list traversal no find the position of the
child within the list.

Regards, Jan

--
Jan Wieck
Senior Software Engineer
http://slony.info

Attachment Content-Type Size
double_link_memory_context_children.diff text/x-patch 2.6 KB
t1.py text/x-python 725 bytes

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2015-09-11 13:38:39 Re: Double linking MemoryContext children
Previous Message Tom Lane 2015-09-11 13:31:30 Re: Parser emits mysterious error message for very long tokens