ホームページ >コンピューターのチュートリアル >コンピュータ知識 >テーブルからレコードをランダムに選択する方法
テーブル内の N データの Oracle ランダム読み取り方法:
1) select * from (select * from tablename order by sys_guid()) where rownum 2) select * from (select * from tablename order by dbms_random.value) where rownum3) select * from (select * from table_name sample( 10) trunc(dbms_random.value(0, 1000))) で並べ替えます。行番号の説明:
sample(10) は、テーブル内のデータの 10% を取得することを意味します。サンプル値は [0.000001,99.999999] の間である必要があります。ここで、sys_guid() と dbms_random.value は両方とも内部関数です
###注記:###sys_guid() メソッドを使用すると、同じレコードが取得されることがあります。つまり、前のクエリの結果セットが同じです。この状況は、Windows システムでは正常ですが、Linux システムでは異常であるなど、オペレーティング システムに関連している可能性があります。さらに、sys_guid() 関数自体に問題がある可能性があるため、さらなる調査が必要です。
異なるプラットフォームで読み取られるデータがランダムであることを保証するには、2) と 3) の 2 つの解決策を採用することをお勧めします。このうち、2) のソリューションがより一般的に使用され、3) のソリューションは、大規模なテーブルのクエリを実行し、あまりデータを抽出しない場合に適しており、クエリ速度を向上させることができます。
大規模なデータセットからいくつかのレコードをランダムに抽出する方法
1
2
3
1) select * from (select * from tablename order by sys_guid()) where rownum 2) select * from (select * from tablename order by dbms_random.value) where rownum3) select * from (select * from table_name sample( 10) trunc(dbms_random.value(0, 1000))) で並べ替えます。ここで、rownum
イラスト:
sample(10) は、テーブル内のデータの 10% を取得することを意味します。サンプル値は [0.000001,99.999999] の間である必要があります。ここで、sys_guid() と dbms_random.value は両方とも内部関数です
###注記:###sys_guid() メソッドを使用すると、同じレコードが取得されることがあります。つまり、前のクエリの結果セットが同じです。この状況は、Windows システムでは正常ですが、Linux システムでは異常であるなど、オペレーティング システムに関連している可能性があります。さらに、sys_guid() 関数自体に問題がある可能性があるため、さらなる調査が必要です。
異なるプラットフォームで読み取られるデータがランダムであることを保証するには、2) と 3) の 2 つの解決策を採用することをお勧めします。このうち、2) のソリューションがより一般的に使用され、3) のソリューションは、大規模なテーブルのクエリを実行し、あまりデータを抽出しない場合に適しており、クエリ速度を向上させることができます。
Oracle のテーブルからランダムなレコードをクエリする方法
最近の作業の必要性は、比較的大きなテーブルからレコードをランダムに抽出することです。MS SQLSERVER とは異なり、Oracle は Select TOP 1 * From TABLE Order By NewID () を直接使用して、レコードの検索を効率的にランダム化できます。いくつかの問題があった後、900,000 レコードと 1 つのゲーム ID フィールドのみを持つテーブル t_id を使用しました。このフィールドにはインデックスがありません。テーブルには、テスト用に 100000 から 999999 までの一連のデータ レコードが含まれています:
rownum と dbms_random.value を使用すると、平均時間は 5 秒です。この効率は実際には低すぎます。小さなテーブルには問題ありませんが、大きなテーブルには適していません。
###宣言する###n_id 番号(6);
###始める###SELECT gameid into n_id FROM(SELECT gameid FROM t_id T ORDER BY dbms_random.value()) WHERE ROWNUM=1;
dbms_output.put_line(to_char(n_id));
###終わり;###/
方法 2.
Oracle サンプル構文を使用し、ランダム サンプルを 1% に設定すると、結果は約 0.01 かかり、非常に高速です。ただし、公式 Web サイトによると、サンプル収集機能を使用すると不正確な結果セットが生成される可能性があります。私のテストでは、間違った結果は見つかりませんでした。ただし問題があります。ランダムな結果の分布は非常に不均一であり、結果はほぼすべて 100000 ~ 200000 レコードに保存されます。効率は良いですが、ランダムな効果は得られませんが、結果がそれほど高くない場合、この方法は非常に優れています。
###宣言する###n_id 番号(6);
###始める###select gameid into n_id FROM t_id SAMPLE (1) WHERE ROWNUM = 1;
dbms_output.put_line(to_char(n_id));
###終わり;###/
方法 3.
マイナス構文を使用して、まずテーブル内のレコードの総数の範囲内で乱数をランダムに取得し、次に rownum を介して 2 つの結果セットを 1 つのレコードのみ異なるものでクエリし、マイナスを使用してレコードを減算します。平均時間は約1秒、乱数が小さいほどクエリ速度が速く、乱数が20000の場合は0.016秒かかります。この方法ですが
非常にランダムな効果が得られる可能性がありますが、効率はこの方法 2 ほど良くありません。効率が平均的であれば、使用を検討できます。
###宣言する###n_count int:=0;
n_rand_num int:=0;
n_id 番号(6);
###始める###SELECT COUNT(*) INTO n_count FROM t_id;
SELECT trunc(dbms_random.value(1,n_count 1)) INTO n_rand_num FROM DUAL;
select gameid into n_id from (SELECT gameid FROM t_id T WHERE rownum SELECT ゲーム ID FROM t_id T WHERE rownum dbms_output.put_line(to_char(n_id)); /
以上がテーブルからレコードをランダムに選択する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。