Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

pengambilan sampel acak sederhana sambil menarik data dari gudang (mesin Oracle) menggunakan proc sql di sas

Gunakan Paket DBMS_RANDOM untuk Mengurutkan Catatan dan Kemudian Gunakan Klausa Pembatas Baris untuk Membatasi Ukuran Sampel yang Diinginkan

Fungsi dbms_random.value memperoleh angka acak antara 0 dan 1 untuk semua baris dalam tabel dan kami mengurutkan dalam urutan menaik dari nilai acak.

Berikut adalah cara menghasilkan kumpulan sampel yang Anda identifikasi:

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

Untuk mendemonstrasikan dengan contoh tabel skema, emp , kami mengambil sampel 4 catatan:

   [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

Dengan contoh di atas, perhatikan bahwa empno berubah secara signifikan selama eksekusi perintah SQL*Plus.

Performanya mungkin bermasalah dengan jumlah baris yang Anda gambarkan.

EDIT:

Dengan ukuran meja di urutan 150 pertunjukan - 79 MM, penyortiran apa pun akan menyakitkan.

Jika tabel memiliki kunci pengganti berdasarkan urutan yang bertambah 1, kita dapat mengambil pendekatan dengan memilih setiap record ke-n berdasarkan kunci tersebut.

misalnya

    --scenario n = 3000

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

Pendekatan ini tidak akan menggunakan indeks (kecuali indeks berbasis fungsi dibuat), tetapi setidaknya kita tidak melakukan pengurutan pada kumpulan data sebesar ini.

Saya melakukan rencana penjelasan dengan tabel yang memiliki hampir 80 juta catatan dan melakukan pemindaian tabel penuh (kondisi memaksa ini tanpa indeks berbasis fungsi) tetapi ini terlihat dapat dipertahankan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ubah baris menjadi kolom di oracle10g

  2. apa yang terjadi pada fase cutover dari adopsi di R12.2

  3. Instalasi Oracle Developer Tools 12 gagal mengklaim saya memiliki Windows XP. Saya memiliki Windows 7

  4. SQLcl untuk mentransfer data dari Oracle ke PostgreSQL atau YugabyteDB

  5. Sembunyikan pernyataan SQL> di file spool