2010-02-12 30 views
8

Tôi có quy trình đồng bộ hóa ứng dụng dành cho thiết bị di động. Giao dịch thực hiện rất nhiều sửa đổi trên cơ sở dữ liệu. Vì điều này được thực hiện trên thiết bị di động, tôi cần phát hành VACUUM để nén cơ sở dữ liệu.Tôi có nên chạy VACUUM trong giao dịch hoặc sau đó không?

tôi tự hỏi khi nào tôi nên đưa ra một chân không

  • trong giao dịch, như tuyên bố chính thức
  • hoặc sau khi giao dịch?

Tôi hiện đang tìm kiếm SQLite, nhưng nếu nó khác nhau cho các công cụ khác, cho tôi biết trong các câu trả lời (PostgreSQL, MySQL, Oracle, SQLServer)

Trả lời

4

Tôi sẽ nói bên ngoài giao dịch. Chắc chắn trong PostgreSQL, VACUUM được thiết kế để loại bỏ các bộ "chết" (tức là hàng cũ khi một bản ghi đã bị thay đổi hoặc bị xóa.)

Nếu bạn đang chạy VACUUM trong một giao dịch có bản ghi sửa đổi, những hàng đã chết này sẽ không được đánh dấu để xóa.

Tùy thuộc vào loại VACUUM bạn đang làm, nó cũng có thể yêu cầu khóa bảng sẽ chặn nếu có các giao dịch khác đang chạy, vì vậy bạn có khả năng kết thúc trong tình huống bế tắc (giao dịch 1 bị chặn đang chờ khóa bảng để thực hiện VACUUM, giao dịch 2 bị chặn chờ đợi một hàng được phát hành mà giao dịch 1 đã bị khóa.)

Tôi cũng khuyên rằng điều này không được thực hiện trong một ứng dụng (có thể là một tác vụ theo lịch) vì có thể mất một lúc để hoàn thành và có thể ảnh hưởng xấu đến tốc độ của các truy vấn khác.

Đối với SQL Server, không có VACUUM - những gì bạn đang tìm kiếm bị thu nhỏ. Bạn có thể bật tự động thu nhỏ vào năm 2005 sẽ tự động lấy lại không gian khi máy chủ quyết định hoặc phát hành một câu lệnh DBCC để thu nhỏ cơ sở dữ liệu và tệp nhật ký, nhưng điều này phụ thuộc vào thường trình và chiến lược sao lưu của bạn trên một cấp cơ sở dữ liệu.

1

chân không giống như chống phân mảnh, rất tốt để làm gì nếu youve gần đây đã xóa rất nhiều thứ, hoặc có thể sau khi bạn chèn rất nhiều thứ, nhưng không có nghĩa là bạn nên làm điều đó trong mọi giao dịch. Nó chậm hơn so với hầu hết các lệnh cơ sở dữ liệu khác và là một nhiệm vụ bảo trì.

Đôi khi chúng tôi thêm/xóa phần lớn tệp db của chúng tôi, do đó, chân không sẽ là một ý tưởng hay, nhưng tôi vẫn không coi đó là một phần của cùng một giao dịch đã thực hiện công việc.

0

Giao dịch thường xuyên như thế nào? Nó thực sự là một loại quá trình hàng ngày không phải là một truy vấn theo quá trình truy vấn, nhưng nếu bạn sử dụng nó mà không có đầy đủ thì nó có thể được sử dụng trong một giao dịch vì nó không có khóa.

Nếu bạn định làm như vậy thì nó sẽ nằm ngoài giao dịch vì nó độc lập với tính toàn vẹn của dữ liệu giao dịch.

+0

Nó được thực hiện sau quá trình đồng bộ hóa di động.Giao dịch trước thực hiện rất nhiều sửa đổi trên cơ sở dữ liệu. Vì điều này được thực hiện trên thiết bị di động, tôi cần phát hành VACUUM để nén cơ sở dữ liệu. – Pentium10

13

Muốn hay không khi sử dụng PostgreSQL bạn không thể chạy CHÂN KHÔNG trong giao dịch như đã nêu trong manual:

CHÂN không thể được thực hiện bên trong một khối giao dịch.

+0

Cảm ơn bạn, rất vui được biết về PostgreSQL. – Pentium10

+1

Tương tự cho SQLite: http://www.sqlite.org/lang_vacuum.html – Constantin

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