PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Song song đến với VACUUM

Chân không là một trong những tính năng quan trọng nhất để lấy lại các bộ giá trị đã xóa trong bảng và chỉ mục. Nếu không có chân không, các bảng và chỉ mục sẽ tiếp tục phát triển về kích thước mà không có giới hạn. Bài đăng trên blog này mô tả tùy chọn PARALLEL cho lệnh VACUUM, mới được giới thiệu cho PostgreSQL13.

Các giai đoạn xử lý chân không

Trước khi thảo luận sâu về tùy chọn mới, hãy xem xét chi tiết về cách hoạt động của chân không.

Chân không (không có tùy chọn ĐẦY ĐỦ) bao gồm năm giai đoạn. Ví dụ:đối với một bảng có hai chỉ mục, nó hoạt động như sau:

  1. Giai đoạn quét đống
    • Quét bảng từ trên xuống và thu thập các bộ chứa rác trong bộ nhớ.
  2. Pha chân không chỉ số
    • Hút sạch từng chỉ mục một.
  3. Pha chân không đống
    • Hút bụi đống (bảng).
  4. Giai đoạn dọn dẹp chỉ mục
    • Xóa từng chỉ mục một.
  5. Giai đoạn cắt bớt đống
    • Cắt bớt các trang trống ở cuối bảng.

Trong giai đoạn quét đống, chân không có thể sử dụng Bản đồ hiển thị để bỏ qua quá trình xử lý các trang được coi là không có bất kỳ rác nào, trong khi ở cả giai đoạn chân không chỉ mục và giai đoạn dọn dẹp chỉ mục, tùy thuộc vào phương pháp truy cập chỉ mục, quá trình quét toàn bộ chỉ mục là bắt buộc.

Ví dụ:chỉ mục btree, loại chỉ mục phổ biến nhất, yêu cầu quét toàn bộ chỉ mục để loại bỏ các bộ chứa rác và thực hiện dọn dẹp chỉ mục. Vì chân không luôn được thực hiện bởi một quá trình duy nhất nên các chỉ số được xử lý từng cái một. Thời gian thực hiện hút chân không lâu hơn, đặc biệt là trên bàn lớn thường gây khó chịu cho người sử dụng.

Tùy chọn PARALLEL

Để giải quyết vấn đề này, tôi đã đề xuất một bản vá để song song hóa chân không vào năm 2016. Sau một quá trình xem xét lâu dài và nhiều cải cách, tùy chọn PARALLEL đã được giới thiệu cho PostgreSQL 13. Với tùy chọn này, chân không có thể thực hiện giai đoạn chân không chỉ mục và giai đoạn dọn dẹp chỉ mục với công nhân song song. Công nhân hút chân không song song khởi động trước khi bước vào giai đoạn chân không chỉ số hoặc giai đoạn làm sạch chỉ số và thoát ra khi kết thúc giai đoạn. Một nhân viên cá nhân được chỉ định cho một chỉ mục. Chân không song song luôn bị tắt trong autovacuum.

Tùy chọn PARALLEL không có tùy chọn đối số số nguyên sẽ tự động tính toán độ song song dựa trên số chỉ mục trên bảng.

VACUUM (PARALLEL) tbl;

Vì quy trình người lãnh đạo luôn xử lý một chỉ mục, nên số lượng công nhân song song tối đa sẽ là (số chỉ mục trong bảng - 1), con số này còn bị giới hạn ở max_parallel_maintenance_workers. Chỉ mục mục tiêu phải lớn hơn hoặc bằng min_parallel_index_scan_size.

Tùy chọn PARALLEL cho phép chúng tôi chỉ định độ song song bằng cách chuyển một giá trị nguyên khác 0. Ví dụ sau sử dụng ba công nhân, tổng cộng là bốn quy trình song song.

VACUUM (PARALLEL 3) tbl;

Tùy chọn PARALLEL được bật theo mặc định ; để tắt chân không song song, hãy đặt max_parallel_maintenance_workers thành 0 hoặc chỉ định PARALLEL 0 .

VACUUM (PARALLEL 0) tbl; -- disable parallel vacuum

Nhìn vào đầu ra VACUUM VERBOSE, chúng ta có thể thấy rằng một công nhân đang xử lý chỉ mục.

Nhân viên báo cáo thông tin được in dưới dạng "by song song".

VACUUM (PARALLEL, VERBOSE) tbl;
INFO: vacuuming "public.tbl"
INFO: launched 2 parallel vacuum workers for index vacuuming (planned: 2)
INFO: scanned index "i1" to remove 112834 row versions
DETAIL: CPU: user: 9.80 s, system: 3.76 s, elapsed: 23.20 s
INFO: scanned index "i2" to remove 112834 row versions by parallel vacuum worker
DETAIL: CPU: user: 10.64 s, system: 8.98 s, elapsed: 42.84 s
INFO: scanned index "i3" to remove 112834 row versions by parallel vacuum worker
DETAIL: CPU: user: 10.65 s, system: 8.98 s, elapsed: 43.96 s
INFO: "tbl": removed 112834 row versions in 112834 pages
DETAIL: CPU: user: 1.12 s, system: 2.31 s, elapsed: 22.01 s
INFO: index "i1" now contains 150000000 row versions in 411289 pages
DETAIL: 112834 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: index "i2" now contains 150000000 row versions in 411289 pages
DETAIL: 112834 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: index "i3" now contains 150000000 row versions in 411289 pages
DETAIL: 112834 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: "tbl": found 112834 removable, 112833240 nonremovable row versions in 553105 out of 735295 pages
DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 430046
There were 444 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 18.00 s, system: 8.99 s, elapsed: 91.73 s.
VACUUM

Phương pháp truy cập chỉ mục Mức độ song song Vs

Chân không không nhất thiết phải luôn thực hiện song song giai đoạn chân không chỉ mục và giai đoạn làm sạch chỉ mục. Nếu kích thước chỉ mục nhỏ hoặc nếu biết rằng quy trình có thể hoàn thành nhanh chóng, chi phí khởi chạy và quản lý nhân viên song song cho quá trình song song sẽ gây ra chi phí. Tùy thuộc vào các phương pháp truy cập chỉ mục và kích thước của nó, tốt hơn là không nên thực hiện các giai đoạn này bằng quy trình nhân viên hút chân không song song.

Ví dụ:khi hút bụi chỉ số btree đủ lớn, giai đoạn chân không chỉ số của chỉ số có thể được thực hiện bởi nhân viên hút chân không song song vì nó luôn yêu cầu quét toàn bộ chỉ số, trong khi giai đoạn làm sạch chỉ số được thực hiện bởi nhân viên hút chân không song song nếu chỉ số chân không được thực hiện (ví dụ:không có rác trên bàn). Điều này là do những gì các chỉ mục btree yêu cầu trong giai đoạn dọn dẹp chỉ mục là thu thập thống kê chỉ số, cũng được thu thập trong giai đoạn chân không chỉ mục. Mặt khác, chỉ mục băm luôn không yêu cầu quét chỉ mục trong giai đoạn dọn dẹp chỉ mục.

Để hỗ trợ các loại chiến lược chân không chỉ mục khác nhau, nhà phát triển các phương pháp truy cập chỉ mục có thể chỉ định các hành vi này bằng cách đặt cờ thành amparallelvacuumoptions trường của IndexAmRoutine cấu trúc. Các cờ có sẵn như sau:

  • VACUUM_OPTION_NO_PARALLEL (mặc định)
    • chân không song song bị tắt ở cả hai giai đoạn.
  • VACUUM_OPTION_PARALLEL_BULKDEL
    • giai đoạn chân không chỉ mục có thể được thực hiện song song.
  • VACUUM_OPTION_PARALLEL_COND_CLEANUP
    • giai đoạn làm sạch chỉ mục có thể được thực hiện song song nếu giai đoạn hút chân không chỉ mục chưa được thực hiện.
  • VACUUM_OPTION_PARALLEL_CLEANUP
    • giai đoạn làm sạch chỉ mục có thể được thực hiện song song ngay cả khi giai đoạn chân không chỉ mục đã xử lý chỉ mục.

Bảng dưới đây cho thấy chỉ mục AMs tích hợp trong PostgreSQL hỗ trợ chân không song song như thế nào.

nbtree băm gin gist spgist brin bloom
VACUUM_OPTION_PARALLEL_BULKDEL
VACUUM_OPTION_PARALLEL_COND_CLEANUP
VACUUM_OPTION_CLEANUP

Xem ‘src / include / command /uum.h‘ để biết thêm chi tiết.

Xác minh hiệu suất

Tôi đã đánh giá hiệu suất của chân không song song trên máy tính xách tay của mình (Core i7 2,6 GHz, RAM 16 GB, SSD 512 GB). Kích thước bảng là 6GB và có tám chỉ mục 3GB. Tổng tương quan là 30GB, không vừa với RAM của máy. Đối với mỗi lần đánh giá, tôi làm cho vài phần trăm bàn bị bẩn đồng đều sau khi hút bụi, sau đó thực hiện hút chân không trong khi thay đổi độ song song. Biểu đồ bên dưới cho thấy thời gian thực hiện chân không.

Trong tất cả các đánh giá, thời gian thực hiện của chân không chỉ số chiếm hơn 95% tổng thời gian thực hiện. Do đó, việc song song hóa giai đoạn chân không chỉ mục đã giúp giảm thời gian thực hiện chân không rất nhiều.

Cảm ơn

Đặc biệt cảm ơn Amit Kapila vì đã tận tâm xem xét, cung cấp lời khuyên và cam kết tính năng này cho PostgreSQL 13. Tôi đánh giá cao tất cả các nhà phát triển đã tham gia vào tính năng này để xem xét, thử nghiệm và thảo luận.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django:Các phương pháp hay nhất để chuyển một dự án từ sqlite sang PostgreSQL là gì

  2. Làm thế nào để thực hiện một truy vấn chọn trong một khối DO?

  3. Tên cột PostgreSQL có phân biệt chữ hoa chữ thường không?

  4. Định dạng ngày Postgres UTC &truyền kỷ nguyên, đảo ngược ký hiệu

  5. Cách buộc đánh giá truy vấn con trước khi tham gia / đẩy xuống máy chủ nước ngoài