Jim C. Nasby wrote:

On Wed, Apr 20, 2005 at 08:10:23PM -0400, Paul Tillotson wrote:


P. S.

The last time I thought about it, I decided that the best solution is probably one that works just like vacuum full except that it scans the table in reverse order. It would do something like this:

- Wait for exclusive lock.


That's exactly what I want to avoid. The reality of cluster and vacuum
full is that many (if not most) installs can't use them because of how
they disrupt the system. I'd like a version that doesn't do that.



The version I outlined releases its exclusive lock every time it
successfully moves all the tuples out of a page.  This means that it
will only hold one long enough to find free space for the tuples in the
page that it is currently trying to clear, which should not take long if
the table is bloated.

After that, it releases it, and then every transaction waiting for that
lock gets to go again before it takes an exclusive lock.  On a lightly
loaded system, this should be unnoticeable.

The use-case which I was targeting is when you are trying to shrink a
table that is being used for a web application--a wait of 1 second is
ok, but wait of 5 minutes isn't.

- Start at the end of the table -- call this page I.
- If page I is completely empty, shrink the heap and go to step 1 again.
(Page I is not empty now.)
- *Scan forward in the table until you find a page that is empty. (Call it J)
If no such page is found, there is no more free space in the table. Exit.
- Move the tuples from page I to page J.
- Drop the exclusive lock. and go to step one.



Same basic idea. I haven't gone into specific details because I want to
see how feasable it is. And since I can't code it myself the best I can
hope for is a TODO; and IMO I shouldn't try and tell whoever takes that
TODO how exactly to make this work.


Regards,
Paul Tillotson




---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq

Reply via email to