Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cập nhật n hàng ngẫu nhiên trong SQL

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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. vượt qua giới hạn 32k khi chèn tham số oracle clob IN bằng Spring StoredProcedure

  2. Chuyển đổi phút sang định dạng HH24:MI

  3. tên bảng động trong câu lệnh chọn

  4. Làm cách nào để thực thi các phần tử tạo xmlforest ngay cả khi giá trị biểu thức là null?

  5. Phương thức thực thi Spring Hibernate Template trả về loại đối tượng nào cho một truy vấn đếm trên Oracle?