Tôi sẽ sử dụng ROWID:
UPDATE xyz SET x='Y' WHERE rowid IN (
SELECT r FROM (
SELECT ROWID r FROM xyz ORDER BY dbms_random.value
) RNDM WHERE rownum < n+1
)
Tuy nhiên, lý do thực tế mà tôi sử dụng ROWID không phải vì hiệu quả (nó vẫn sẽ quét toàn bộ bảng) - SQL của bạn có thể không cập nhật số hàng bạn muốn nếu cột m
không phải là duy nhất.
Chỉ với 1000 hàng, bạn không thực sự nên lo lắng về hiệu quả (có thể với hàng trăm triệu hàng). Không có bất kỳ chỉ mục nào trên bảng này, bạn đang gặp khó khăn khi quét toàn bộ bảng để chọn các bản ghi ngẫu nhiên.
[CHỈNH SỬA:] "Nhưng điều gì sẽ xảy ra nếu có 100.000 hàng"
Chà, đó vẫn là 3 đơn đặt hàng có quy mô nhỏ hơn 100 triệu.
Tôi đã chạy như sau:
create table xyz as select * from all_objects;
[đã tạo khoảng 50.000 hàng trên hệ thống của tôi - không được lập chỉ mục, giống như bảng của bạn]
UPDATE xyz SET owner='Y' WHERE rowid IN (
SELECT r FROM (
SELECT ROWID r FROM xyz ORDER BY dbms_random.value
) RNDM WHERE rownum < 10000
);
commit;
Quá trình này mất khoảng 1,5 giây. Có thể là 1 giây, có thể lên đến 3 giây (không chính thức là thời gian, chỉ mất khoảng đủ thời gian để chớp mắt).