Để kiểm tra xem cái gì CLUSTER
, tôi lấy một bảng cho tôi từ một thí nghiệm trước đó về cơ bản chứa 10 triệu số nguyên dương đầu tiên. Tôi đã xóa một số hàng và cũng có một cột khác nhưng chúng chỉ ảnh hưởng đến kích thước bảng thực tế, vì vậy nó không thú vị.
Đầu tiên, khi chạy VACUUM FULL
trên bàn fka
, tôi lấy kích thước của nó:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Sau đó, hãy xem thứ tự vật lý của dữ liệu từ đầu bảng:
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)
Bây giờ hãy xóa một số hàng:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Sau này, kích thước bảng báo cáo không thay đổi. Vì vậy, bây giờ hãy xem những gì 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)
Sau khi hoạt động, kích thước bảng thay đổi từ 338 thành 296 MB. Từ ctid
cột, mô tả vị trí vật lý của bộ dữ liệu trong trang, bạn cũng thấy rằng không có khoảng cách nơi khớp hàng id = 5
được sử dụng.
Khi các bộ dữ liệu được sắp xếp lại, các chỉ mục nên được tạo lại để chúng trỏ đến đúng vị trí.
Vì vậy, sự khác biệt có vẻ là VACUUM FULL
không đặt hàng. Theo tôi biết, có một số khác biệt trong cơ chế mà hai lệnh sử dụng nhưng theo quan điểm thực tế thì đây dường như là sự khác biệt chính (duy nhất?).