เพื่อตรวจสอบสิ่งที่CLUSTER
ฉันทำเอาตารางของฉันจากการทดลองก่อนหน้าซึ่งโดยทั่วไปมีจำนวนเต็มบวก 10 ล้านแรก ฉันลบแถวไปแล้วและมีอีกคอลัมน์หนึ่งเช่นกัน แต่สิ่งเหล่านี้มีผลกับขนาดของตารางจริงเท่านั้นดังนั้นจึงไม่น่าสนใจ
ก่อนอื่นวิ่ง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 เป็น 296 MB จากctid
คอลัมน์ซึ่งอธิบายถึงสถานที่ทางกายภาพของ tuple ในหน้าคุณจะเห็นว่าไม่มีช่องว่างในการจับคู่แถวที่id = 5
เคยเป็น
เมื่อเรียงลำดับ tuples ใหม่ดัชนีควรถูกสร้างขึ้นใหม่เพื่อให้ชี้ไปยังตำแหน่งที่ถูกต้อง
ดังนั้นความแตกต่างดูเหมือนจะVACUUM FULL
ไม่เรียงลำดับแถว เท่าที่ฉันรู้มีความแตกต่างบางอย่างในกลไกที่ทั้งสองใช้คำสั่ง แต่จากมุมมองของการปฏิบัตินี้ดูเหมือนว่าจะเป็นความแตกต่างหลัก (เท่านั้น?)