2009-04-02 31 views
21

Tôi có một tiện ích trong ứng dụng của mình, nơi tôi cần thực hiện tải hàng loạt các hoạt động INSERT, UPDATE & DELETE. Tôi đang cố gắng tạo ra giao dịch xung quanh điều này để một khi hệ thống này được gọi và dữ liệu được nạp vào nó, nó được đảm bảo rằng nó hoặc là tất cả hoặc không có gì được thêm vào cơ sở dữ liệu.Kích thước giao dịch tối đa trong PostgreSQL

Điều quan tâm là điều kiện biên là gì? Có bao nhiêu INSERT, UPDATE & DELETE tôi có thể có trong một giao dịch? Kích thước giao dịch có thể cấu hình được không?

Mọi trợ giúp sẽ được đánh giá cao.

-Cảm ơn

Trả lời

18

Tôi không nghĩ rằng có số lượng công việc tối đa có thể thực hiện trong giao dịch. Dữ liệu tiếp tục được thêm vào các tệp bảng và cuối cùng giao dịch là cam kết hoặc quay lại: AIUI kết quả này được lưu trữ trong pg_clog; nếu nó quay trở lại, không gian cuối cùng sẽ được khai hoang bằng chân không. Vì vậy, nó không phải là nếu công việc giao dịch đang diễn ra được tổ chức trong bộ nhớ và đỏ bừng tại thời gian cam kết, ví dụ.

+14

Điều này chỉ đúng một phần. Bên trong mỗi giao dịch là một bộ đếm lệnh giao dịch với khả năng hiển thị bên trong giao dịch. Đây là một số 32 bit mà cuối cùng sẽ tràn nếu bạn có một giao dịch rất lớn (hàng tỷ lệnh). VACUUM, pg_clog vv chỉ đề cập đến tổng số giao dịch trong hệ thống chứ không phải những gì xảy ra bên trong một trong số chúng. –

+0

@MagnusHagander Số 32 bit này có đúng không? Số này có được cập nhật lên 64 bit không? – Kuberchaun

+0

Có, bộ đếm lệnh nội bộ vẫn còn 32 bit. –

16

Đối với một dự án tôi làm việc, tôi thực hiện 20 triệu INSERT. Tôi đã thử với một giao dịch lớn và với một giao dịch cho mỗi triệu INSERT và các buổi biểu diễn có vẻ giống hệt nhau.

PostgreSQL 8.3

+1

Hệ thống có phải là địa phương không? Tôi nghĩ rằng làm điều này trên một hệ thống mà độ trễ là một yếu tố, hiệu suất sẽ khác nhau. – user2677679

0

Tôi tin rằng số lượng công việc tối đa bị giới hạn bởi kích thước tệp nhật ký của bạn. Cơ sở dữ liệu sẽ không bao giờ cho phép bản thân không thể khôi phục, vì vậy nếu bạn tiêu thụ tất cả không gian đăng nhập của mình trong giao dịch, nó sẽ tạm dừng cho đến khi bạn cung cấp thêm không gian hoặc quay lại. Điều này nói chung là đúng đối với tất cả các cơ sở dữ liệu.

Tôi muốn giới thiệu các bản cập nhật của bạn thành các đoạn có thể quản lý, mất vài phút thực hiện, theo cách đó bạn biết nếu có sự cố sớm hơn (ví dụ: bình thường mất 1 phút vẫn chạy sau 10 phút ... hmmm, ai đó đã đánh chỉ mục?)

+8

Điều này không đúng đối với PostgreSQL. Chúng ta có thể tái chế không gian log trong một giao dịch đang chạy. Nếu bạn đang ghi lưu trữ, bạn rõ ràng sẽ cần không gian trong vị trí lưu trữ, nhưng đối với nhật ký giao dịch cục bộ thì không cần thiết. (bạn sẽ cần không gian đĩa thực tế cho dữ liệu trên đĩa, tất nhiên). –

18

Một giao dịch đơn lẻ có thể chạy khoảng hai tỷ lệnh trong đó (2^31, trừ IIRC một chút chi phí trên đầu. Thực ra, hãy nghĩ về nó, có thể là 2^32 - commandcounter là unsigned tôi nghĩ).

Mỗi lệnh trong số đó có thể sửa đổi nhiều hàng, tất nhiên.

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