]> granicus.if.org Git - postgresql/commit
Fix O(N^2) behavior in pg_dump when many objects are in dependency loops.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 31 Mar 2012 19:51:22 +0000 (15:51 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 31 Mar 2012 19:51:22 +0000 (15:51 -0400)
commita584bc5cb05cb9c5a2e98e3416107bb38bc5b9a0
tree14e633000d3137e95d1a3f207191212e0742ef6f
parent80c40f07eb31aa70d245a25b4a5b9ad1d010c431
Fix O(N^2) behavior in pg_dump when many objects are in dependency loops.

Combining the loop workspace with the record of already-processed objects
might have been a cute trick, but it behaves horridly if there are many
dependency loops to repair: the time spent in the first step of findLoop()
grows as O(N^2).  Instead use a separate flag array indexed by dump ID,
which we can check in constant time.  The length of the workspace array
is now never more than the actual length of a dependency chain, which
should be reasonably short in all cases of practical interest.  The code
is noticeably easier to understand this way, too.

Per gripe from Mike Roest.  Since this is a longstanding performance bug,
backpatch to all supported versions.
src/bin/pg_dump/pg_dump_sort.c