Mọi ghi vào cơ sở dữ liệu đều có nhiều tác dụng phụ tiềm ẩn.
Xóa: phải xóa hàng, chỉ mục được cập nhật, khóa ngoại và có thể bị xóa, v.v. Chèn: hàng phải được cấp - điều này có thể thay cho hàng đã xóa, có thể không được; chỉ mục phải được cập nhật, kiểm tra khóa ngoài, v.v. Cập nhật: phải cập nhật một hoặc nhiều giá trị; có lẽ dữ liệu của hàng không còn phù hợp với khối cơ sở dữ liệu đó nữa, do đó phải phân bổ nhiều không gian hơn, có thể xếp vào nhiều khối được viết lại hoặc dẫn đến các khối bị phân mảnh; nếu giá trị có các ràng buộc khóa ngoài, chúng phải được kiểm tra, v.v.
Đối với một số cột rất nhỏ hoặc nếu toàn bộ hàng được cập nhật Xóa + chèn có thể nhanh hơn, nhưng vấn đề ràng buộc FK là một vấn đề lớn. Chắc chắn, có thể bạn không có ràng buộc FK bây giờ, nhưng điều đó luôn luôn đúng? Và nếu bạn có một kích hoạt, nó dễ dàng hơn để viết mã xử lý các bản cập nhật nếu hoạt động cập nhật thực sự là một bản cập nhật.
Một vấn đề khác cần suy nghĩ là đôi khi việc chèn và xóa giữ các khóa khác với việc cập nhật. DB có thể khóa toàn bộ bảng trong khi bạn đang chèn hoặc xóa, thay vì chỉ khóa một bản ghi trong khi bạn đang cập nhật bản ghi đó.
Cuối cùng, tôi khuyên bạn chỉ nên cập nhật một bản ghi nếu bạn muốn cập nhật nó. Sau đó, kiểm tra thống kê hiệu suất của DB và thống kê cho bảng đó để xem có cải thiện hiệu suất nào không. Bất cứ điều gì khác là quá sớm.
Ví dụ từ hệ thống thương mại điện tử tôi làm việc: Chúng tôi đã lưu trữ dữ liệu giao dịch thẻ tín dụng trong cơ sở dữ liệu theo cách tiếp cận hai bước: đầu tiên, viết một phần giao dịch để cho biết rằng chúng tôi đã bắt đầu quá trình. Sau đó, khi dữ liệu ủy quyền được trả về từ ngân hàng, hãy cập nhật hồ sơ. Chúng tôi đã xóa rồi chèn lại bản ghi nhưng thay vào đó chúng tôi chỉ sử dụng bản cập nhật. DBA của chúng tôi nói với chúng tôi rằng bảng đã bị phân mảnh vì DB chỉ phân bổ một lượng nhỏ không gian cho mỗi hàng và bản cập nhật đã gây ra khối chuỗi vì nó đã thêm nhiều dữ liệu. Tuy nhiên, thay vì chuyển sang DELETE + INSERT, chúng tôi chỉ điều chỉnh cơ sở dữ liệu để luôn phân bổ toàn bộ hàng, điều này có nghĩa là bản cập nhật có thể sử dụng không gian trống được phân bổ trước mà không có vấn đề gì. Không cần thay đổi mã và mã vẫn đơn giản và dễ hiểu.
Nguồn
2009-08-13 14:31:05
là một thực tế, tôi không bao giờ khuyên bạn nên cập nhật cột khóa chính. –
@KM: Tôi đồng ý, đây là cách đơn giản hóa bảng thực sự của tôi, nơi tất cả tra cứu được thực hiện trên một trường chuỗi duy nhất không phải là khóa chính. Tôi có một giá trị int khóa chính hoàn toàn không liên quan nên tôi đã xóa nó khỏi ví dụ (nó được tạo tự động và không tham gia tra cứu) –
@KM: Tôi đã cập nhật ví dụ để phản ánh cấu trúc bảng thực, chỉ trong trường hợp nó tạo ra sự khác biệt. –