117 votes

sélection rapide de lignes aléatoires dans Postgres

J'ai une table dans postgres qui contient quelques millions de lignes. J'ai vérifié sur internet et j'ai trouvé ce qui suit

 SELECT myid FROM mytable ORDER BY RANDOM() LIMIT 1;
 

ça marche, mais c'est vraiment lent ... y a-t-il un autre moyen de faire cette requête, ou un moyen direct de sélectionner un hasard sans avoir à lire tout le tableau? À propos, "myid" est un entier mais peut être un champ vide.

Merci

122voto

NPE Points 169956

Vous voudrez peut-être expérimenter avec OFFSET , comme dans

SELECT myid FROM mytable OFFSET random()*N LIMIT 1;

Le N est le nombre de lignes dans mytable . Vous devrez peut-être d'abord faire SELECT COUNT(*) pour déterminer la valeur de N .

36voto

John Coryat Points 141

J'ai essayé cela avec une sous-requête et cela a bien fonctionné. Offset, du moins dans Postgresql v8.4.4, fonctionne correctement.

 select * from mytable offset random() * (select count(*) from mytable) limit 1 ;
 

32voto

Antony Hatchkins Points 5831

Vous devez utiliser floor :

 SELECT myid FROM mytable OFFSET floor(random()*N) LIMIT 1;
 

16voto

Bob Points 9217

Suivez ce lien pour des options différentes. http://www.depesz.com/index.php/2007/09/16/my-thoughts-on-getting-random-row/

Mise À Jour: (A. Hatchkins)

Le résumé de la (très) long article est comme suit.

L'auteur énumère quatre approches:

1) ORDER BY random() LIMIT 1; -- lent

2) ORDER BY id where id>=random()*N LIMIT 1 -- non uniforme si il y a des lacunes

3) aléatoire colonne -- doit être mis à jour chaque maintenant et puis

4) personnalisé aléatoire globale -- la ruse méthode peut être très lente: random() doit être générée N fois

et suggère d'améliorer la méthode #2 à l'aide de

5) ORDER BY id where id=random()*N LIMIT 1 avec la suite actualise si le résultat est vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X