[pgsql-jp: 37627] Re: VACUUM FULL の物理的なテーブルの切り詰め方について
Katsuhiko Okano
okano.katsuhiko @ oss.ntt.co.jp
2006年 10月 31日 (火) 19:51:16 JST
岡野と申します。
> VACUUM
> FULLを実行すると、物理的に不要領域が削除されてテーブルサイズが小さくなりますが、
> 不要領域が削除された分、不要領域より後ろの使用済み領域が、順々に前へ押し出されていくのでしょうか?
> (不要領域より後ろの領域が全て移動するのでしょうか)
> それとも、削除される不要領域のサイズに合わせて、適した使用済み領域を当てはめていき、テーブルサイズを小さくしているのでしょうか?
> (不要領域より後ろの領域の一部のみが移動するのでしょうか)
> それとも、全く別の方式でしょうか?
src/backend/commands/vacuum.c の中のrepair_frag関数に、コメントで
以下の記述があります。
/*
* Scan pages backwards from the last nonempty page, trying to move tuples
* down to lower pages. Quit when we reach a page that we have moved any
* tuples onto, or the first page if we haven't moved anything, or when we
* find a page we cannot completely empty (this last condition is handled
* by "break" statements within the loop).
*
* NB: this code depends on the vacuum_pages and fraged_pages lists being
* in order by blkno.
*/
これらを見ると、順々に前へ押し出すのではなく、
ブロック番号の大きなほうから0ブロック目に近いほうにレコードを移動させる
(そのためレコードの順番が変わる)のではないでしょうか。
--------
Katsuhiko Okano
okano katsuhiko _at_ oss ntt co jp
pgsql-jp メーリングリストの案内