2013-08-28 26 views
5

Postgres chúng tôi 9.2.4 Máy chủ đang mất 0.69s trung bình (15000 báo cáo) để thực hiệnTại sao SET CONSTRAINTS ALL DEFERRED trên Postgresql mất một thời gian dài?

SET CONSTRAINTS ALL DEFERRED 

Tại sao điều này nên được?

Sử dụng INITIALLY DEFERRED trong định nghĩa bảng và không sử dụng SET CONSTRAINTS .. loại bỏ thời gian này hoặc chỉ ẩn nó ở một nơi khác?

+1

Bạn đo thời gian đó như thế nào? Điều này có bao gồm chi phí truyền thông máy khách/máy chủ không? Tại sao đây lại là vấn đề? Bạn chạy câu lệnh đó bao lâu một lần? –

+0

Thời gian được đo bằng cách phân tích tệp nhật ký với pgfouine tức là thời gian bên máy chủ được báo cáo bởi Postgres. Trong một ngày nó thực hiện 15000 lần và mất hơn 3h trong tổng số. Máy chủ này đang chèn/cập nhật nhiều lô hàng và chúng tôi đang cố gắng tăng thông lượng. –

+1

Tại sao bạn thực hiện câu lệnh này 15000 lần mỗi ngày? –

Trả lời

1

Imho, điều này có thể là do mỗi lần bạn chạy câu lệnh này, điều xảy ra trong nền là một câu lệnh cập nhật lớn trên các định nghĩa bảng nằm trong pg_catalog. Nói cách khác, bạn thêm hàng chết vào pg_catalog, điều này dẫn đến lượng không gian đĩa ngày càng lớn được truy cập trong quá trình quét seq thích hợp.

Nếu bạn đang thực sự chạy báo cáo 15k lần mỗi ngày, có lẽ bạn cần cung cấp cái nhìn lạnh lùng cho lược đồ hoặc quy trình làm việc của bạn?

+0

Aha. Điều đó có nghĩa là sử dụng "INITIALLY DEFERRED" trong các định nghĩa bảng thay vào đó sẽ sắp xếp điều này ra? Cơ sở dữ liệu có hơn 5000 bảng trong 100 hoặc nhiều lược đồ. Tôi giả định rằng "SET CONSTRAINTS ALL DEFERRED" sẽ chỉ đặt một cờ tx và nhanh. –

+0

Về mặt kỹ thuật, bạn không chính xác. Nó thực sự là thiết lập một lá cờ cho mỗi ràng buộc mỗi khi bạn chỉnh sửa các bảng (trở lại * và * ra). Sự cố là, bạn đã gắn cờ cho mỗi ràng buộc bị thay đổi. Đó là rất nhiều thông tin cập nhật (tức là xóa + chèn); nói cách khác là truy cập đĩa. Và có, đi với khó khăn ban đầu trì hoãn ban đầu khi thích hợp nếu điều đó khắc phục vấn đề của bạn. –

+3

Điều này không đúng. SET CONSTRAINTS không chạm vào danh mục hệ thống. –

4

Tôi đã xem qua mã nguồn. Về cơ bản, SET CONSTRAINTS ALL DEFERRED không có gì ngoại trừ việc thiết lập một biến toàn cầu lưu ý "tất cả các ràng buộc thích hợp hiện nay được hoãn lại". Công việc duy nhất không thực hiện được thực hiện là khi có các giao dịch phụ trong khi chơi. Nếu điều đó áp dụng cho trường hợp của bạn, hãy thử nó mà không cần. (Lưu ý rằng các giao dịch phụ bao gồm các khối ngoại lệ PL/pgSQL.)

+0

Hmm. Vâng bằng cách nào đó cho chúng tôi '' 'SET CONSTRAINTS ALL DEFERRED' '' đã lấy trung bình 0,69 cho mỗi giao dịch. Theo tôi biết, chúng tôi không sử dụng các giao dịch phụ (nghĩa là không có mục đích). Chúng tôi đang sử dụng trình điều khiển JDBC Postgres để có thể đang thực hiện điều gì đó. Chúng tôi cũng nhận được thông báo "GIAO DỊCH" trong các nhật ký nếu có một đầu mối. Chúng tôi đã làm cho vấn đề này biến mất bằng cách sử dụng '' 'INITIALLY DEFERRED' '' ngay bây giờ. –

Các vấn đề liên quan