Vì bạn đang tham gia hai bảng lớn và không có điều kiện nào có thể lọc ra các hàng, nên chiến lược kết hợp hiệu quả duy nhất sẽ là kết hợp băm và không chỉ mục nào có thể giúp được việc đó.
Đầu tiên sẽ có một quá trình quét tuần tự của một trong các bảng, từ đó một cấu trúc băm được xây dựng, sau đó sẽ có một quá trình quét tuần tự trên bảng khác và băm sẽ được thăm dò cho từng hàng được tìm thấy. Làm cách nào để bất kỳ chỉ mục nào có thể giúp được điều đó?
Bạn có thể mong đợi một hoạt động như vậy mất nhiều thời gian, nhưng có một số cách để bạn có thể tăng tốc hoạt động:
-
Xóa tất cả các chỉ mục và ràng buộc trên
tx_input1
trước khi bắt đầu. Truy vấn của bạn là một trong những ví dụ mà một chỉ mục không giúp ích gì cả, nhưng thực sự gây hại hiệu suất, bởi vì các chỉ mục phải được cập nhật cùng với bảng. Tạo lại các chỉ mục và ràng buộc sau khi bạn thực hiện xong vớiUPDATE
. Tùy thuộc vào số lượng chỉ mục trên bảng, bạn có thể mong đợi mức tăng hiệu suất từ khá đến lớn. -
Tăng
work_mem
cho một thao tác này vớiSET
chỉ huy cao nhất có thể. Hoạt động băm có thể sử dụng càng nhiều bộ nhớ thì tốc độ càng nhanh. Với một bảng lớn có thể bạn sẽ vẫn có các tệp tạm thời, nhưng bạn vẫn có thể mong đợi một mức tăng hiệu suất tốt. -
Tăng
checkpoint_segments
(hoặcmax_wal_size
từ phiên bản 9.6 trở đi) lên giá trị cao để có ít điểm kiểm tra hơn trongUPDATE
hoạt động. -
Đảm bảo rằng thống kê bảng trên cả hai bảng là chính xác để PostgreSQL có thể đưa ra ước tính tốt cho số lượng nhóm băm cần tạo.
Sau UPDATE
, nếu nó ảnh hưởng đến một số lượng lớn hàng, bạn có thể cân nhắc chạy VACUUM (FULL)
trên tx_input1
để thoát khỏi bảng kết quả bị phình ra. Thao tác này sẽ khóa bảng trong thời gian dài hơn, vì vậy hãy làm điều đó trong thời gian bảo trì. Nó sẽ làm giảm kích thước của bảng và do đó tăng tốc độ quét tuần tự.