Cách tốt nhất để tiếp cận câu hỏi này là chèn 4 triệu bản ghi vào một bảng. Trên thực tế, bạn có thể đặt chúng vào một bảng có cột nhận dạng bằng cách "chèn hàng loạt" vào chế độ xem.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Với tất cả dữ liệu trong cơ sở dữ liệu, giờ đây bạn có nhiều lựa chọn hơn. Hãy thử cập nhật:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Bạn cũng nên tạo chỉ mục trên TheIds(id)
.
Đây là một bản cập nhật lớn, tất cả đều thực hiện như một giao dịch. Điều đó có thể có tác động xấu đến hiệu suất và bắt đầu lấp đầy nhật ký. Bạn có thể chia nó thành các giao dịch nhỏ hơn bằng cách sử dụng rownum
cột:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
Mệnh đề tồn tại ở đây hoạt động tương đương với left outer join
. Sự khác biệt chính là cú pháp truy vấn con tương quan này sẽ hoạt động trong các cơ sở dữ liệu khác, trong đó các phép nối với các bản cập nhật là dành riêng cho cơ sở dữ liệu.
Với rownum
, bạn có thể chọn bao nhiêu hàng tùy ý cho bản cập nhật. Vì vậy, bạn có thể đặt bản cập nhật trong một vòng lặp, nếu bản cập nhật tổng thể quá lớn:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
và như thế. Bạn không phải làm điều này, nhưng bạn có thể làm nếu bạn muốn cập nhật hàng loạt vì lý do nào đó.
Ý tưởng chính là đưa danh sách id vào một bảng trong cơ sở dữ liệu, vì vậy bạn có thể sử dụng sức mạnh của cơ sở dữ liệu cho các hoạt động tiếp theo.