Thu nhỏ PostgreSQL TRIGGER (s)


14

Làm thế nào Postgres kích hoạt quy mô cơ chế?

Chúng tôi có một bản cài đặt PostgreSQL lớn và chúng tôi đang cố gắng triển khai một hệ thống dựa trên sự kiện bằng cách sử dụng các bảng nhật ký và TRIGGER (s).

Về cơ bản, chúng tôi muốn tạo TRIGGER cho mỗi bảng mà chúng tôi muốn được thông báo cho hoạt động CẬP NHẬT / XÁC NHẬN / XÓA. Khi trình kích hoạt này kích hoạt, nó sẽ thực thi một chức năng đơn giản sẽ nối một hàng mới (mã hóa sự kiện) vào bảng nhật ký mà sau đó chúng ta sẽ thăm dò ý kiến ​​từ một dịch vụ bên ngoài.

Trước khi thực hiện tất cả với Postgres TRIGGER (s), chúng tôi muốn biết quy mô của chúng: chúng tôi có thể tạo bao nhiêu kích hoạt trên một cài đặt Postgres? Chúng có ảnh hưởng đến hiệu suất truy vấn không? Có ai trước đây đã thử điều này?


Bạn có thể thấy việc kiểm tra PGQ hữu ích, nó sử dụng trình kích hoạt C để đăng ký các sự kiện sửa đổi dữ liệu.
dezso 7/1/2015

Hãy xem lắng nghe / thông báo bạn có thể không cần kích hoạt gì cả: postgresql.org/docs/civerse/static/sql-listen.html
a_horse_with_no_name 7/1/2015

Câu trả lời:


17

Về cơ bản, chúng tôi muốn tạo TRIGGER cho mỗi bảng mà chúng tôi muốn được thông báo cho hoạt động CẬP NHẬT / XÁC NHẬN / XÓA. Khi trình kích hoạt này kích hoạt, nó sẽ thực thi một chức năng đơn giản sẽ nối một hàng mới (mã hóa sự kiện) vào bảng nhật ký mà sau đó chúng ta sẽ thăm dò ý kiến ​​từ một dịch vụ bên ngoài.

Đó là một cách sử dụng khá chuẩn cho một kích hoạt.

Trước khi thực hiện tất cả với Postgres TRIGGER (s), chúng tôi muốn biết quy mô của chúng: chúng tôi có thể tạo bao nhiêu kích hoạt trên một cài đặt Postgres?

Nếu bạn tiếp tục tạo chúng, cuối cùng bạn sẽ hết dung lượng đĩa.

Không có giới hạn cụ thể cho các kích hoạt.

Giới hạn PostgreSQL được ghi lại trên trang về .

Chúng có ảnh hưởng đến hiệu suất truy vấn không?

Nó phụ thuộc vào loại kích hoạt, ngôn ngữ kích hoạt và những gì kích hoạt làm.

Một trình BEFORE ... FOR EACH STATEMENTkích hoạt PL / PGQuery đơn giản không làm bất cứ điều gì có chi phí gần như bằng không.

FOR EACH ROWkích hoạt có chi phí cao hơn so với FOR EACH STATEMENTkích hoạt. Rõ ràng, tỷ lệ, với số lượng hàng bị ảnh hưởng.

AFTERkích hoạt đắt hơn BEFOREkích hoạt bởi vì chúng phải được xếp hàng cho đến khi câu lệnh kết thúc thực hiện công việc của nó, sau đó được thực thi. Chúng không bị đổ vào đĩa nếu hàng đợi trở nên lớn (ít nhất là trong 9,4 trở xuống, có thể thay đổi trong tương lai) vì vậy AFTERhàng đợi kích hoạt lớn có thể khiến bộ nhớ khả dụng bị tràn ngập, dẫn đến hủy bỏ tuyên bố.

Một kích hoạt sửa đổi NEWhàng trước khi chèn / cập nhật rẻ hơn so với kích hoạt DML.

Trường hợp sử dụng cụ thể mà bạn muốn sẽ hoạt động tốt hơn với sự cải tiến đang diễn ra có thể biến nó thành PostgreQuery 9.5 (nếu chúng ta may mắn), trong đó các FOR EACH STATEMENTtrình kích hoạt có thể thấy ảo OLDNEWbảng. Điều này là không thể trong các phiên bản PostgreSQL hiện tại, vì vậy bạn phải sử dụng các FOR EACH ROWkích hoạt thay thế.

Có ai trước đây đã thử điều này?

Tất nhiên. Đó là một cách sử dụng khá chuẩn cho các trình kích hoạt, cùng với kiểm toán, kiểm tra độ tỉnh táo, v.v.

Bạn sẽ muốn xem xét LISTENNOTIFYtìm cách tốt để đánh thức nhân viên của bạn khi thay đổi bảng nhiệm vụ xảy ra.

Bạn đã làm điều quan trọng nhất bằng cách tránh nói chuyện với các hệ thống bên ngoài trực tiếp từ các trình kích hoạt. Điều đó có xu hướng có vấn đề về hiệu suất và độ tin cậy. Mọi người thường cố gắng làm những việc như gửi thư trực tiếp từ một trình kích hoạt, và đó là tin xấu.


1

Đó là một câu trả lời hơi muộn màng, nhưng nó có thể hữu ích cho những độc giả tương lai

Ngày nay (trong 10,11,12 phiên bản), chúng tôi không cần lưu trữ cùng một dữ liệu hai lần (trong WAL của PG và thủ công). Chúng tôi có thể sử dụng cơ chế giải mã logic Postgre (giống như sao chép logic) để theo dõi tất cả hoặc một số thay đổi đối với dữ liệu của chúng tôi (hoặc gửi các sự kiện đó đến một số hàng đợi như kafka để phân tích sau)

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.