Rumah > Artikel > tutorial komputer > Bagaimana untuk memilih rekod secara rawak daripada jadual
Kaedah bacaan rawak Oracle bagi data N dalam jadual:
1) pilih * daripada (pilih * daripada susunan nama jadual mengikut sys_guid()) di mana rownum 2) pilih * daripada (pilih * daripada susunan nama jadual mengikut dbms_random.value) di mana rownum3) pilih * daripada (pilih * daripada sampel_nama_jadual(10) pesanan mengikut trunc(dbms_random.value(0, 1000))) di mana rownum Penerangan:
sample(10) bermaksud mendapatkan semula 10% daripada data dalam jadual Nilai sampel hendaklah antara [0.000001,99.999999], dengan sys_guid() dan dbms_random.value adalah kedua-dua fungsi dalaman
Nota:
Apabila menggunakan kaedah sys_guid(), kadangkala rekod yang sama akan diperolehi, iaitu set hasil pertanyaan sebelumnya adalah sama. Keadaan ini mungkin berkaitan dengan sistem pengendalian Sebagai contoh, ia adalah normal di bawah sistem Windows dan tidak normal di bawah sistem Linux. Di samping itu, mungkin terdapat masalah dengan fungsi sys_guid() itu sendiri dan kajian lanjut diperlukan.
Untuk memastikan bahawa data yang dibaca pada platform berbeza adalah rawak, disyorkan untuk menggunakan dua penyelesaian: 2) dan 3). Antaranya, penyelesaian 2) lebih biasa digunakan, dan penyelesaian 3) sesuai untuk menanyakan jadual besar dan tidak mengekstrak banyak data, dan boleh meningkatkan kelajuan pertanyaan.
Kaedah bacaan rawak Oracle bagi data N dalam jadual:
1
2
3
1) pilih * daripada (pilih * daripada susunan nama jadual mengikut sys_guid()) di mana rownum 2) pilih * daripada (pilih * daripada susunan nama jadual mengikut dbms_random.value) di mana rownum3) pilih * daripada (pilih * daripada sampel_nama_jadual(10) pesanan mengikut trunc(dbms_random.value(0, 1000))) di mana rownum
Penerangan:
sample(10) bermaksud mendapatkan semula 10% daripada data dalam jadual Nilai sampel hendaklah antara [0.000001,99.999999], dengan sys_guid() dan dbms_random.value adalah kedua-dua fungsi dalaman
Nota:
Apabila menggunakan kaedah sys_guid(), kadangkala rekod yang sama akan diperolehi, iaitu set hasil pertanyaan sebelumnya adalah sama. Keadaan ini mungkin berkaitan dengan sistem pengendalian Sebagai contoh, ia adalah normal di bawah sistem Windows dan tidak normal di bawah sistem Linux. Di samping itu, mungkin terdapat masalah dengan fungsi sys_guid() itu sendiri dan kajian lanjut diperlukan.
Untuk memastikan bahawa data yang dibaca pada platform berbeza adalah rawak, disyorkan untuk menggunakan dua penyelesaian 2) dan 3). Antaranya, penyelesaian 2) lebih biasa digunakan, dan penyelesaian 3) sesuai untuk menanyakan jadual besar dan tidak mengekstrak banyak data, dan boleh meningkatkan kelajuan pertanyaan.
Keperluan untuk bekerja pada hari ini adalah untuk mendapatkan semula rekod secara rawak daripada jadual yang agak besar, Tidak seperti MS SQLSERVER, Oracle boleh terus menggunakan Pilih TOP 1 * Dari TABLE Order By NewID () untuk mendapatkan rekod A secara rawak. Selepas banyak masalah, saya menggunakan t_id jadual dengan 900,000 rekod dan hanya satu medan gameid Tiada indeks pada medan ini. Jadual mengandungi satu siri rekod data dari 100000 hingga 999999 untuk ujian:
.Kaedah 1.
Menggunakan rownum dan dbms_random.value, masa purata ialah 5 saat Kecekapan ini sememangnya terlalu rendah. Ia sepatutnya OK untuk meja kecil, tetapi ia tidak sesuai untuk meja besar.
isytiharkan
n_id nombor(6);
mulakan
PILIH gameid ke dalam n_id DARI(PILIH gameid DARI t_id T ORDER OLEH dbms_random.value()) WHERE ROWNUM=1;
dbms_output.put_line(to_char(n_id));
akhir;
/
Kaedah 2.
Menggunakan sintaks sampel oracle, menetapkan sampel rawak kepada 1%, hasilnya mengambil masa kira-kira 0.01, yang agak pantas, bagaimanapun, menurut laman web rasmi, menggunakan ciri pengumpulan sampel mungkin menghasilkan set hasil yang tidak tepat ujian kepada keputusan yang salah. Tetapi ada masalah, iaitu, pengagihan keputusan rawak sangat tidak sekata, dan hasilnya hampir semuanya disimpan dalam rekod 100000-200000. Walaupun kecekapannya baik, ia tidak mencapai kesan rawak yang baik Jika hasilnya tidak terlalu tinggi, kaedah ini agak baik.
isytiharkan
n_id nombor(6);
mulakan
PILIH gameid ke dalam n_id DARI T_id CONTOH (1) DI MANA ROWNUM = 1;
dbms_output.put_line(to_char(n_id));
akhir;
/
Kaedah 3.
Menggunakan sintaks tolak, mula-mula dapatkan nombor rawak secara rawak dalam julat jumlah bilangan rekod dalam jadual, kemudian tanya dua set hasil dengan hanya satu perbezaan rekod melalui rownum, dan gunakan tolak untuk menolak rekod dengan nombor rawak dalam pendahuluan. Masa purata Kira-kira 1 saat Lebih kecil nombor rawak, lebih cepat kelajuan pertanyaan Apabila nombor rawak ialah 20000, ia mengambil masa 0.016 saat. Walaupun kaedah ini
Ia boleh mendapat kesan yang sangat rawak, tetapi kecekapannya tidak sebaik kaedah 2. Jika kecekapan adalah purata, anda masih boleh mempertimbangkan untuk menggunakannya.
isytiharkan
n_count int:=0;
n_rand_num int:=0;
n_id nombor(6);
mulakan
PILIH COUNT(*) KE DALAM n_count DARI t_id;
PILIH trunc(dbms_random.value(1,n_count+1)) KE DALAM n_rand_num DARIPADA DUAL;
pilih gameid ke n_id dari (PILIH gameid DARI t_id T WHERE rownum tolak PILIH gameid DARI t_id T WHERE rownum dbms_output.put_line(to_char(n_id)); akhir; /
Atas ialah kandungan terperinci Bagaimana untuk memilih rekod secara rawak daripada jadual. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!