Maison > Article > tutoriels informatiques > Comment sélectionner au hasard un enregistrement dans une table
Méthode de lecture aléatoire Oracle de N données dans le tableau :
1) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par sys_guid()) où numéro de ligne 2) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par dbms_random.value) où numéro de ligne3) sélectionnez * from (sélectionnez * dans l'échantillon de nom de table (10) trier par trunc(dbms_random.value(0, 1000))) où rownum Description :
sample(10) signifie récupérer 10 % des données de la table. La valeur de l'échantillon doit être comprise entre [0,000001,99,999999], où sys_guid() et dbms_random.value sont toutes deux des fonctions internes
.Remarque :
Lors de l'utilisation de la méthode sys_guid(), les mêmes enregistrements seront parfois obtenus, c'est-à-dire que l'ensemble de résultats de la requête précédente est le même. Cette situation peut être liée au système d'exploitation. Par exemple, elle est normale sous le système Windows et anormale sous le système Linux. De plus, il peut y avoir des problèmes avec la fonction sys_guid() elle-même et des recherches supplémentaires sont nécessaires.
Pour garantir que les données lues sur les différentes plateformes soient aléatoires, il est recommandé d'adopter deux solutions 2) et 3). Parmi elles, la solution 2) est la plus couramment utilisée, et la solution 3) convient pour interroger de grandes tables et extraire peu de données, et peut améliorer la vitesse de requête.
Méthode de lecture aléatoire Oracle de N données dans le tableau :
1
2
3
1) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par sys_guid()) où numéro de ligne 2) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par dbms_random.value) où numéro de ligne3) sélectionnez * from (sélectionnez * dans l'échantillon de nom de table (10) trier par trunc(dbms_random.value(0, 1000))) où rownum
Description :
sample(10) signifie récupérer 10 % des données de la table. La valeur de l'échantillon doit être comprise entre [0,000001,99,999999], où sys_guid() et dbms_random.value sont toutes deux des fonctions internes
.Remarque :
Lors de l'utilisation de la méthode sys_guid(), les mêmes enregistrements seront parfois obtenus, c'est-à-dire que l'ensemble de résultats de la requête précédente est le même. Cette situation peut être liée au système d'exploitation. Par exemple, elle est normale sous le système Windows et anormale sous le système Linux. De plus, il peut y avoir des problèmes avec la fonction sys_guid() elle-même et des recherches supplémentaires sont nécessaires.
Pour garantir que les données lues sur les différentes plateformes soient aléatoires, il est recommandé d'adopter deux solutions : 2) et 3). Parmi elles, la solution 2) est la plus couramment utilisée, et la solution 3) convient pour interroger de grandes tables et extraire peu de données, et peut améliorer la vitesse de requête.
La nécessité de travailler de nos jours est de récupérer aléatoirement un enregistrement d'une table relativement volumineuse. Contrairement à MS SQLSERVER, Oracle peut utiliser directement Select TOP 1 * From TABLE Order By NewID () pour le récupérer efficacement de manière aléatoire. Après beaucoup de problèmes, nous avons utilisé une table t_id avec 900 000 enregistrements et un seul champ gameid. Il n'y a pas d'index sur ce champ. La table contient une série d'enregistrements de données de 100 000 à 999 999 pour les tests :
Méthode 1.
En utilisant rownum et dbms_random.value, le temps moyen est de 5 secondes. Cette efficacité est en effet trop faible. Elle devrait convenir pour les petites tables, mais elle ne convient pas aux grandes tables.
déclarer
numéro n_id(6);
commencer
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));
fin;
/
Méthode 2.
En utilisant la syntaxe d'échantillon Oracle, en définissant l'échantillon aléatoire à 1%, le résultat prend environ 0,01, ce qui est assez rapide. Cependant, selon le site officiel, l'utilisation de la fonction de collecte d'échantillons peut produire des ensembles de résultats inexacts. le test. Mais il y a un problème, c'est que la répartition des résultats aléatoires est très inégale et que les résultats sont presque tous stockés dans 100 000 à 200 000 enregistrements. Bien que l’efficacité soit bonne, elle n’obtient pas un bon effet aléatoire. Si les résultats ne sont pas très élevés, cette méthode est plutôt bonne.
déclarer
numéro n_id(6);
commencer
SELECT gameid dans n_id FROM t_id SAMPLE (1) WHERE ROWNUM = 1;
dbms_output.put_line(to_char(n_id));
fin;
/
Méthode 3.
En utilisant la syntaxe moins, obtenez d'abord au hasard un nombre aléatoire compris dans la plage du nombre total d'enregistrements dans la table, puis interrogez les deux ensembles de résultats avec une seule différence d'enregistrement via rownum, et utilisez moins pour soustraire l'enregistrement avec le nombre aléatoire dans avance.Le temps moyen Environ 1 seconde. Plus le nombre aléatoire est petit, plus la vitesse de requête est rapide. Lorsque le nombre aléatoire est de 20 000, cela prend 0,016 seconde. Bien que cette méthode
Cela peut obtenir un effet très aléatoire, mais l'efficacité n'est pas aussi bonne que celle de la méthode 2. Si l'efficacité est moyenne, vous pouvez toujours envisager de l'utiliser.
déclarer
n_count int:=0;
n_rand_num int:=0;
numéro n_id(6);
commencer
SELECT COUNT(*) INTO n_count FROM t_id;
SELECT trunc(dbms_random.value(1,n_count+1)) INTO n_rand_num FROM DUAL;
sélectionnez gameid dans n_id à partir de (SELECT gameid FROM t_id T WHERE rownum moins SELECT gameid FROM t_id T WHERE rownum dbms_output.put_line(to_char(n_id)); fin; /
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!