Maison >base de données >tutoriel mysql >Comment sélectionner efficacement des lignes aléatoires à partir de grandes tables PostgreSQL ?
Méthode de sélection de lignes aléatoires PostgreSQL
Les méthodes traditionnelles de sélection de lignes aléatoires sont inefficaces et lentes lorsqu'il s'agit de grandes tables contenant des millions, voire des milliards d'enregistrements. Deux méthodes courantes sont :
Utilisez random()
pour filtrer :
<code class="language-sql"> select * from table where random() < 0.001;</code>
Utilisez order by random()
et limit
:
<code class="language-sql"> select * from table order by random() limit 1000;</code>
Cependant, en raison de la nécessité d'une analyse ou d'un tri complet de la table, ces méthodes ne sont pas le meilleur choix pour les tables comportant un grand nombre de lignes et entraîneront des goulots d'étranglement en termes de performances.
Méthodes d'optimisation pour les grandes tables
Pour les types de tableaux suivants, considérez la méthode d'optimisation suivante, qui est nettement plus rapide :
Requête :
<code class="language-sql">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;</code>
Comment ça marche :
Estimation de la plage d'identification :
Génération d'ID aléatoire :
Élimination des redondances et des doublons :
Jointures et restrictions de tables :
Pourquoi c'est rapide :
Utilisation minimale de l'index :
Génération de nombres aléatoires optimisée :
Élimination des redondances et des doublons :
Autres options :
CTE récursif pour gérer les lacunes :
Wrappers de fonctions à réutiliser :
Fonctions universelles pour n'importe quelle table :
Matérialiser les vues pour plus de rapidité :
TABLE SAMPLE
dans PostgreSQL 9.5 :
TABLE SAMPLE SYSTEM
" de PostgreSQL pour implémenter une méthode d'échantillonnage de lignes plus rapide mais moins aléatoire, garantissant qu'un nombre précis de lignes est renvoyé. Cependant, gardez à l’esprit que l’échantillon peut ne pas être complètement aléatoire en raison des effets de regroupement. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!