Đầu tiên và trước hết, CHỌN theo sau là CẬP NHẬT hầu như luôn luôn không chính xác theo đồng thời. Trừ khi mọi thứ chạy dưới mức cô lập SERIALIZABLE, không có gì đảm bảo rằng các hàng không thay đổi giữa số SELECT và UPDATE.
Thứ hai, đối với các trường hợp khi có là hàng cần cập nhật, chi phí SELECT + CẬP NHẬT theo định nghĩa cao hơn chỉ là CẬP NHẬT.
Và cuối cùng, đối với trường hợp khi có không phải là hàng để cập nhật chi phí định vị chúng bằng UPDATE thường giống như chi phí định vị chúng bằng SELECT, vì vậy bạn không đạt được gì. Tôi nói 'thường', không phải 'luôn luôn', bởi vì trình tối ưu hóa truy vấn có thể xem xét các chiến lược khác nhau để cập nhật so với chọn và quét để cập nhật diễn ra theo các quy tắc khóa (concurrency) khác với quét để đọc.
Điều có thể có ý nghĩa là có một SELECT rất rẻ có thể tránh được CẬP NHẬT đắt tiền, ngay cả khi không chính xác 100%. Các điều kiện giữa SELECT và UPDATE có thể thay đổi cực kỳ miễn là bạn không nhận được bất kỳ sai âm (SELECT nói không nên có bất kỳ hàng nào nhưng UPDATE sẽ tìm thấy hàng, nó đã được chạy) và số lượng false tích cực là thấp (SELECT nói có hàng, nhưng kiểm tra UPDATE chính xác hơn/đắt tiền không thực sự tìm thấy bất kỳ).
Cuối cùng, đây là vấn đề tối ưu hóa và tất cả các câu hỏi tối ưu hóa bắt đầu bằng cách đo. Đầu tiên xác định vị trí UPDATE tốn kém và sau đó bắt đầu sửa đổi.
Nguồn
2012-05-31 13:26:31
Tùy thuộc vào mức độ phức tạp của mệnh đề 'WHERE'. Câu lệnh 'UPDATE' sẽ phải tìm ra những hàng đầu tiên để cập nhật - hoặc không có gì. Điều này có thể liên quan đến việc quét bảng, nếu bạn thiếu các chỉ mục thích hợp trên bảng đó. Như mọi khi: ** kiểm tra ** và xem nó tệ như thế nào. Tất nhiên nó sẽ là tốt hơn để xác định chỉ những hàng thực sự cần cập nhật - và sau đó cập nhật chỉ những người. Nhưng bao nhiêu nỗ lực là nó để xác định những hàng đó? –
Nỗ lực sẽ liên quan đến rối tung xung quanh với các biến bảng, và không chỉ một hoặc hai ... Tôi đang nói về 20 câu lệnh cập nhật chạy cùng nhau trong một kịch bản và cập nhật các bảng khác nhau. Xét về nỗ lực phát triển sẽ nhiều hơn là chỉ phát triển các báo cáo cập nhật. Về các điều khoản trong bản cập nhật, hầu hết trong số chúng có một hoặc hai tham gia bên trong nhiều nhất và đơn giản là "null" hoặc "<> 0" trong đó các mệnh đề. –