2012-03-26 34 views
8

Để thực hiện tùy chọn nào sẽ tốt hơn cho các tập dữ liệu lớn sẽ được cập nhật?CASE và nhiều truy vấn UPDATE cho các tập dữ liệu lớn - Hiệu suất

Sử dụng câu lệnh CASE hoặc truy vấn cập nhật riêng lẻ?

trường hợp ví dụ:

UPDATE tbl_name SET field_name = 
CASE 
    WHEN condition_1 THEN 'Blah' 
    WHEN condition_2 THEN 'Foo' 
    WHEN condition_x THEN 123 
    ELSE 'bar' 
END AS value 

cá nhân truy vấn Ví dụ:

UPDATE tbl_name SET field_name = 'Blah' WHERE field_name = condition_1 
UPDATE tbl_name SET field_name = 'Foo' WHERE field_name = condition_2 
UPDATE tbl_name SET field_name = 123 WHERE field_name = condition_x 
UPDATE tbl_name SET field_name = 'bar' WHERE field_name = condition_y 

LƯU Ý: Khoảng 300.000 hồ sơ sẽ được cập nhật và câu lệnh CASE sẽ có khoảng 10.000 KHI điều kiện. Nếu sử dụng các truy vấn riêng lẻ, số lượng khoảng 10.000 cũng là

+2

"Nếu sử dụng các truy vấn riêng lẻ thì khoảng 10.000" - có lẽ bảng tạm thời đã tham gia sẽ là một ý tưởng tốt hơn .... –

+0

+1 Mitch ... không nhận thấy phạm vi khi tôi viết câu trả lời của mình. Về nguyên tắc, 'CASE' sẽ hiệu quả hơn nhưng có thể không ở quy mô đó. – JNK

+0

Thú vị tôi đã không nghĩ đến cách tiếp cận này, Cảm ơn –

Trả lời

13

Phiên bản CASE.

Điều này là do có nhiều khả năng bạn đang thay đổi cùng một hàng nhiều lần bằng các câu lệnh riêng lẻ. Nếu hàng 10 có cả hai số condition_1condition_y thì nó sẽ cần được đọc và thay đổi hai lần. Nếu bạn có một chỉ số nhóm, điều này có nghĩa là hai cập nhật chỉ mục nhóm trên đầu trang của bất kỳ trường nào khác đã được sửa đổi.

Nếu bạn có thể làm điều đó dưới dạng một câu lệnh, mỗi hàng sẽ chỉ được đọc một lần và nó sẽ chạy nhanh hơn nhiều.

Tôi đã thay đổi một quy trình tương tự khoảng một năm trước đã sử dụng hàng chục báo cáo UPDATE theo thứ tự để sử dụng từ UPDATE với CASE và thời gian xử lý giảm khoảng 80%.

0

Có vẻ như logic với tôi rằng trên tùy chọn đầu tiên SQL Server sẽ đi qua bảng chỉ một lần và cho mỗi hàng, nó sẽ đánh giá điều kiện.

Trên thứ hai, nó sẽ phải đi qua tất cả bảng 4 lần

Vì vậy, đối với một bảng với 1000 dòng, vào tùy chọn đầu tiên trên kịch bản trường hợp tốt nhất chúng ta đang nói khoảng 1000 đánh giá và trường hợp xấu nhất, 3000. Thứ hai, chúng tôi sẽ luôn có 4000 đánh giá

Vì vậy, tùy chọn 1 sẽ nhanh hơn.

0

Như đã chỉ ra bởi Mitch, hãy thử tạo một bảng tạm thời lấp đầy nó bằng tất cả dữ liệu bạn cần, tạo một bảng tạm thời khác cho mỗi cột (trường) mà bạn muốn thay đổi. Bạn cũng nên thêm một chỉ mục vào bảng tạm thời để cải thiện hiệu năng.

Bằng cách này báo cáo cập nhật của bạn trở nên (nhiều hơn hoặc ít hơn):

UPDATE tbl_name SET field_name = COALESCE((SELECT value FROM temp_tbl WHERE tbl_name.conditional_field = temp_tbl.condition_value), field_name), 
    field_name2 = COALESCE((SELECT value FROM temp_tbl2 WHERE tbl_name.conditional_field2 = temp_tbl2.condition_value), field_name2) 

và vân vân ..

này sẽ cho bạn hiệu suất tốt trong khi mở rộng quy mô cho khối lượng lớn các bản cập nhật cùng một lúc.

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