Oracleは、テーブルからランダムに取り出されたレコードデータの行を作成します

四种解决方案:

测试数据90万条

方案一:使用dbms_random.random 对数据排序,然后取出第一条,不过这种效率太低,用时3-4秒。

SELECT *FROM (SELECT * FROM TEMP_CODES ORDER BY dbms_random.random) where rownum =1

 

方案二:使用dbms_random.value 对数据排序,与方案一如出一辙

select * from (select * from TEMP_CODES order by dbms_random.value) where rownum<=1

或者使用row_number 函数

SELECT CODE
    FROM ( SELECT CODE, ROW_NUMBER() OVER (ORDER BY dbms_random.value) rn FROM TEMP_CODES )
    WHERE rn = 1;

 

方案三:使用sample随机取样,取得一条随机行,由于是随机样,所以在数据量逐渐变少的时候,取样会出现无法取到的情况,可以通过多次取样来满足始终能取到数据。

选择0.001%的记录

  select *from TEMP_CODES sample(0.001)  WHERE FLAG=0 AND ROWNUM=1;

选择20%的记录

  select *from TEMP_CODES sample(20)  WHERE FLAG=0 AND ROWNUM=1;

选择50%的记录

  select *from TEMP_CODES sample(50)  WHERE FLAG=0 AND ROWNUM=1;

选择70%的记录

  select *from TEMP_CODES sample(70)  WHERE FLAG=0 AND ROWNUM=1;

选择99.99%的记录

  select *from TEMP_CODES sample(99.9999) WHERE FLAG=0 AND ROWNUM=1;

方案四:查询包含条件的记录总数,通过这个记录总数随机生成一个小于等于这个记录总数的数,通过这个随机数去取得记录行。

1、查询剩余的总数记录数:当前为90万

2、生成1-90万之间的随机数randomNum

3、通过随机数查询。

  select * from (select rownum no,code from TEMP_CODES where rownum<=randomNum ) where no >=randomNum

 

以上四种方案皆可得到随机一行记录。个人还是比较倾向于方案三。

 

おすすめ

転載: blog.csdn.net/z3287852/article/details/111228785
おすすめ