PostgreSQL のランダム行選択メソッド
従来のランダムな行選択方法は、数百万、さらには数十億のレコードを含む大きなテーブルを扱う場合、非効率的で時間がかかります。一般的なメソッドは次の 2 つです:
random()
を使用してフィルタリングします:
select * from table where random() < 0.001;
order by random()
と limit
を使用します:
select * from table order by random() limit 1000;
ただし、テーブル全体のスキャンや並べ替えが必要なため、これらの方法は行数が多いテーブルには最適ではなく、パフォーマンスのボトルネックを引き起こす可能性があります。
大規模なテーブルの最適化方法
次のタイプのテーブルの場合は、大幅に高速な次の最適化方法を検討してください。
クエリ:
WITH params AS ( SELECT 1 AS min_id, -- 可选:自定义最小ID起始值 5100000 AS id_span -- 近似ID范围(最大ID - 最小ID + 缓冲) ) SELECT * FROM ( SELECT DISTINCT 1 + trunc(random() * p.id_span)::integer AS id FROM params p, generate_series(1, 1100) g GROUP BY 1 ) r INNER JOIN big ON r.id = big.id LIMIT 1000;
仕組み:
ID 範囲の推定:
ランダム ID 生成:
冗長性と重複の削除:
テーブルの結合と制限:
速い理由:
最小限のインデックス使用量:
最適化された乱数生成:
冗長性と重複の削除:
その他のオプション:
ギャップを処理するための再帰的 CTE:
再利用のための関数ラッパー:
あらゆるテーブルのユニバーサル関数:
高速化のためにビューを実体化する:
TABLE SAMPLE
:
TABLE SAMPLE SYSTEM
」機能を利用して、高速かつランダム性の低い行サンプリング方法を実装し、正確な行数が返されるようにします。ただし、クラスタリング効果により、サンプルは完全にランダムではない可能性があることに注意してください。 以上が大規模な PostgreSQL テーブルからランダムな行を効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。