Sự khác biệt của PostgreSQL giữa VACUUM FULL và CLUSTER


13

Tôi có một bảng với kích thước 200 GB chiếm dụng dữ liệu và 180 GB kích thước theo 6 chỉ mục trên đó. Nó là 30% cồng kềnh, vì vậy tôi muốn lấy lại không gian không mong muốn bị chiếm đóng bởi nó. Nó được nhóm trên job_id_idchỉ số x.

Vì vậy, để lấy lại không gian tôi cần phải sử dụng clusterlệnh hoặc vacuum fulllệnh?

  1. Sự khác biệt giữa hai lệnh này là gì?

  2. vacuum fullthứ tự của một số cột giống như clusterlệnh?

  3. Là chỉ mục được tạo lại trong cả hai lệnh?

  4. Trong trường hợp của tôi cái nào sẽ nhanh hơn?

Phiên bản của cơ sở dữ liệu PostgreSQL là 9.1


1
Có, các chỉ mục sẽ được tạo lại. Cái nào nhanh hơn phụ thuộc vào một vài thứ, tôi tưởng tượng. Nhưng có một điều chắc chắn: không có gì giống như "chân không đặt hàng đầy đủ theo một số cột".
dezso

1
Tôi cũng đề cập rằng VACUUM không thể chạy trong một giao dịch, trong nhiều trường hợp làm cho CLUSTER trở thành một lựa chọn tốt hơn (và đôi khi là sự thay thế duy nhất) tạo ra kết quả tương tự.
oᴉɹǝɥɔ 15/05/2015

Câu trả lời:


8

Để 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 FULLtrê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ừ ctidcộ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 FULLkhô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?).


Tôi không chắc ctidcột là gì. Hóa ra nó là một cột hệ thống mô tả vị trí vật lý của hàng trong bảng của nó. postgresql.org/docs/civerse/ddl-system-columns.html
Gajus

8

VACUUM FULLghi lại toàn bộ nội dung của bảng vào một tệp đĩa mới không có thêm dung lượng, cho phép trả lại không gian chưa sử dụng cho hệ điều hành. Phương pháp này cũng cần thêm dung lượng đĩa, vì nó ghi một bản sao mới của bảng và không giải phóng bản sao cũ cho đến khi hoàn thành thao tác. Thông thường, điều này chỉ nên được sử dụng khi một lượng không gian đáng kể cần phải được thu hồi từ bên trong bảng.

http://www.postgresql.org/docs/9.1/static/sql-vacuum.html

CLUSTERhướng dẫn PostgreSQL phân cụm bảng được chỉ định bởi tên_bảng dựa trên chỉ mục được chỉ định bởi index_name. Chỉ mục phải đã được xác định trên tên_bảng. Khi một bảng được phân cụm, nó được sắp xếp lại một cách vật lý dựa trên thông tin chỉ mục và khóa ACCESS EXCLUSIVE được lấy trên đó.

http://www.postgresql.org/docs/9.1/static/sql-cluster.html

cũng giới thiệu: is-a-reindex-required-after-cluster

Nhưng có lẽ tất cả những gì bạn cần là một cách đơn giản REINDEXđể xây dựng lại một chỉ mục bằng cách sử dụng dữ liệu được lưu trữ trong bảng của chỉ mục, thay thế bản sao cũ của chỉ mục.

http://www.postgresql.org/docs/9.1/static/sql-reindex.html


1
Ái chà! Mẹo hay về REINDEX cũng vậy! Tôi đã thu nhỏ một vài bảng bởi cả VACUUM và CLUSTER (cố gắng so sánh thời gian và tác động để thực hiện trực tiếp) và bây giờ các đối tượng lớn nhất của tôi thực sự là các chỉ số.
mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.