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

lấy mẫu ngẫu nhiên đơn giản trong khi lấy dữ liệu từ kho (oracle engine) sử dụng proc sql trong sas

Sử dụng Gói DBMS_RANDOM để sắp xếp bản ghi và sau đó sử dụng điều khoản giới hạn hàng để hạn chế ở kích thước mẫu mong muốn

Hàm dbms_random.value nhận một số ngẫu nhiên từ 0 đến 1 cho tất cả các hàng trong bảng và chúng tôi sắp xếp theo thứ tự tăng dần của giá trị ngẫu nhiên.

Đây là cách tạo bộ mẫu mà bạn đã xác định:

    SELECT
    *
FROM
    (
        SELECT
            *
        FROM
            tbl1
        ORDER BY dbms_random.value
    )
FETCH FIRST 1000000 ROWS ONLY;

Để minh họa với bảng giản đồ mẫu, emp , chúng tôi lấy mẫu 4 bản ghi:

   [email protected]> SELECT
  2      empno,
  3      rnd_val
  4  FROM
  5      (
  6          SELECT
  7              empno,
  8              dbms_random.value rnd_val
  9          FROM
 10              emp
 11          ORDER BY rnd_val
 12      )
 13  FETCH FIRST 4 ROWS ONLY;
EMPNO  RND_VAL
7698   0.06857749035643605682648168347885993709
7934   0.07529612360785920635181751566833986766
7902   0.13618520865865754766175030040204331697
7654   0.14056380246495282237607922497308953768


[email protected]> SELECT
  2      empno,
  3      rnd_val
  4  FROM
  5      (
  6          SELECT
  7              empno,
  8              dbms_random.value rnd_val
  9          FROM
 10              emp
 11          ORDER BY rnd_val
 12      )
 13  FETCH FIRST 4 ROWS ONLY;
EMPNO  RND_VAL
7839   0.00430658806761508024693197916281775492
7499   0.02188116061148367312927392115186317884
7782   0.10606515700372416131060633064729870016
7788   0.27865276349549877512032787966777990909

Với ví dụ trên, hãy lưu ý rằng empno thay đổi đáng kể trong quá trình thực thi lệnh SQL * Plus.

Hiệu suất có thể là một vấn đề với số lượng hàng bạn đang mô tả.

CHỈNH SỬA:

Với kích thước bảng theo thứ tự 150 hợp đồng biểu diễn - 79 MM, bất kỳ việc phân loại nào cũng sẽ rất khó khăn.

Nếu bảng có khóa thay thế dựa trên trình tự tăng 1, chúng ta có thể thực hiện phương pháp chọn mọi bản ghi thứ n dựa trên khóa.

ví dụ.

    --scenario n = 3000

 FROM
    tbl1
WHERE
    mod(table_id, 3000) = 0;

Cách tiếp cận này sẽ không sử dụng chỉ mục (trừ khi tạo chỉ mục dựa trên hàm), nhưng ít nhất chúng tôi không thực hiện sắp xếp trên tập dữ liệu có kích thước này.

Tôi đã thực hiện một kế hoạch giải thích với một bảng có gần 80 triệu bản ghi và nó thực hiện quét toàn bộ bảng (điều kiện buộc thực hiện điều này mà không có chỉ mục dựa trên hàm) nhưng điều này có vẻ có thể giữ được.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PreparedStatement và setTimestamp trong oracle jdbc

  2. Phiên bản SQL Server của Oracle's ADD_MONTHS ()

  3. trả về tập kết quả từ hàm

  4. thay đổi định dạng ngày từ char

  5. Oracle, Kết nối bằng rownum