2016-05-14 15 views
6

Trích dẫn trích dẫn bên dưới có vẻ mâu thuẫn ở điểm này.Việc sử dụng 'Cam kết giữ lại' có làm giảm hiệu suất Firebird không?

(Cả hai đều khá cũ Tôi nghĩ rằng, điều thứ hai là từ năm 2004 và là người đầu tiên đề cập đến Borland nên phải cũ là tốt, vì vậy có lẽ họ là lỗi thời.)

Đầu tiên dường như cho thấy cam kết duy trì giữ cho các giao dịch hoạt động và do đó sẽ dính OIT. Thứ hai, nếu tôi hiểu nó ngụ ý rằng với một cam kết giữ lại, TID hiện tại được đánh dấu cam kết và giao dịch được giữ sống nhưng với một TID mới và do đó không dính OIT. Trích đoạn thứ hai này liên quan đến Interbase, tôi không biết điều đó có giải thích mâu thuẫn có vẻ không.

Firebird Documentation Extract:

Với Firebird (và Interbase), Commit Giữ nguyên nhân giao dịch để vẫn thú vị vô thời hạn. Việc thu gom rác thải có hiệu quả chấm dứt trên ứng dụng cơ sở dữ liệu công cụ "tiêu chuẩn" Borland RAD và bất kỳ ứng dụng nào khác sử dụng Cam kết giữ lại.

Embarcadero Blog post chiết xuất

đọc cam kết, đọc-ghi:

giao dịch này có thể chạy mãi mãi không có tác động tiêu cực đến hiệu suất nếu bạn làm một cam kết duy trì bất cứ lúc nào.

+2

Firebird được chia đôi từ InterBase vào năm 2000, và nó đã phân kỳ kể từ đó. Đối với tất cả các ý định và mục đích họ nên được coi là cơ sở dữ liệu khác nhau, với quirks riêng của họ vv. Vì vậy, không giả định những hạn chế được mô tả cho một cũng áp dụng cho khác. Điều này cũng áp dụng với các văn bản như _ "(và InterBase)" _ vì nó có thể ám chỉ đến một tính phổ biến lịch sử không còn đúng nữa. –

Trả lời

4

Khi bạn sử dụng cam kết giữ lại (hoặc sử dụng API hoặc với COMMIT RETAIN) với Firebird, giao dịch bắt đầu là không thực sự kết thúc, nó chỉ được kết hợp với các thiết lập của giao dịch có thể nhìn thấy từ một giao dịch mới đã được bắt đầu trong nội bộ , trong khi vẫn giữ (các) cái cũ hoạt động.

Điều này có nghĩa là các giao dịch cũ và thú vị nhất không di chuyển và các phiên bản ngược lại tích lũy không thể thu gom rác cho đến khi giao dịch thực sự được thực hiện. Điều này có nghĩa rằng cuối cùng các truy vấn sẽ cần phải quét một chuỗi dài hơn các phiên bản kỷ lục, có thể có tác động hiệu suất.

Tôi giả định có một số tối ưu có thể, ví dụ giao dịch ban đầu có thể được đánh dấu là đã cam kết nếu không có mở con trỏ được bắt đầu trong giao dịch (một trong các tính năng của cam kết giữ lại là con trỏ không bị đóng về giao dịch cam kết, trong đó - nếu tôi không nhầm - yêu cầu bối cảnh giao dịch cũ vẫn còn tồn tại). Đây có thể là điều mà InterBase đã thực hiện để đọc các giao dịch đã cam kết.

Điều này có thể được xem bằng cách bắt đầu phiên isql và thực hiện một số chèn kết hợp với cam kết giữ lại: nếu bạn kiểm tra gstat -h kết hợp, bạn sẽ thấy giao dịch cũ thú vị nhất và cũ nhất không di chuyển cho đến khi bạn thực sự cam kết.

+1

Cảm ơn Mark, bạn đã trả lời câu hỏi nhưng có lẽ đã tăng lên gấp đôi trong tâm trí của tôi! Có lẽ tôi sẽ hỏi một câu hỏi khác hoặc 2 nếu tôi không thể tìm ra! – kjack

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