diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-01-26 15:20:22 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-01-26 15:20:30 -0500 |
commit | cc988fbb0bf60a83b628b5615e6bade5ae9ae6f4 (patch) | |
tree | 406d462838cc8bb05376801802de58d8bef4d631 /src/backend/access | |
parent | 879d71393de001880e031255e41ca322c6027713 (diff) | |
download | postgresql-cc988fbb0bf60a83b628b5615e6bade5ae9ae6f4.tar.gz postgresql-cc988fbb0bf60a83b628b5615e6bade5ae9ae6f4.zip |
Improve ResourceOwners' behavior for large numbers of owned objects.
The original coding was quite fast so long as objects were always
released in reverse order of addition; otherwise, it degenerated into
O(N^2) behavior due to searching for the array element to delete.
Improve matters by switching to hashed storage when the number of
objects of a given type exceeds 64. (The cutover point is open to
discussion, of course, but some simple performance testing suggests
that hashing has enough overhead to be a loser below there.)
Also, refactor resowner.c so that we don't need N copies of the array
management code. Since all the resource IDs the code currently needs
to deal with are either pointers or integers, it seems sufficient to
create a one-size-fits-all infrastructure in which everything is
converted to a Datum for storage.
Aleksander Alekseev, reviewed by Stas Kelvich, further fixes by me
Diffstat (limited to 'src/backend/access')
-rw-r--r-- | src/backend/access/hash/hashfunc.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/backend/access/hash/hashfunc.c b/src/backend/access/hash/hashfunc.c index dabaf5a7dc2..614f4ff2f5b 100644 --- a/src/backend/access/hash/hashfunc.c +++ b/src/backend/access/hash/hashfunc.c @@ -297,6 +297,9 @@ hashvarlena(PG_FUNCTION_ARGS) * of 2. There is no need to do mod a prime (mod is sooo slow!). * If you need less than 32 bits, use a bitmask. * + * This procedure must never throw elog(ERROR); the ResourceOwner code + * relies on this not to fail. + * * Note: we could easily change this function to return a 64-bit hash value * by using the final values of both b and c. b is perhaps a little less * well mixed than c, however. |