何をCLUSTER
行うかを確認するために、基本的に最初の1,000万個の正の整数を含む以前の実験のテーブルを使用しました。すでにいくつかの行を削除し、他の列もありますが、これらは実際のテーブルサイズにのみ影響するため、それほど興味深いものではありません。
まず、VACUUM FULL
テーブルfka
で実行した後、そのサイズを取りました。
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
次に、テーブルの最初からのデータの物理的な順序を見てみましょう。
SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;
id | col1 | ctid
-----+------+---------
2 | 2 | (0,1)
3 | 3 | (0,2)
4 | 4 | (0,3)
5 | 5 | (0,4)
6 | 6 | (0,5)
次に、いくつかの行を削除しましょう。
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
この後、報告されたテーブルサイズは変更されませんでした。それでは、何をするのか見てみましょうCLUSTER
:
CLUSTER fka USING fka_pkey;
SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;
id | col1 | ctid
-----+------+---------
2 | 2 | (0,1)
3 | 3 | (0,2)
4 | 4 | (0,3)
6 | 6 | (0,4)
7 | 7 | (0,5)
操作後、テーブルサイズは338 MBから296 MBに変更されました。ctid
ページ内のタプルの物理的な場所を説明する列から、行の一致があったところにギャップがないこともわかりid = 5
ます。
タプルの順序が変更されたため、正しい場所を指すようにインデックスを再作成する必要がありました。
そのため、違いはVACUUM FULL
、行を並べ替えないように見えることです。私の知る限り、2つのコマンドが使用するメカニズムには多少の違いがありますが、実際的な観点からは、これが主な(唯一の)違いのようです。