Une variation de la vue matérialisée "alternative" décrites par Erwin Brandstetter est possible.
Dire, par exemple, que vous ne voulez pas de doublons dans les randomisés valeurs retournées. Donc, vous devez définir une valeur booléenne sur la table primaire contenant votre (non randomisée) ensemble de valeurs.
En supposant que c'est la table d'entrée:
id_values id | used
----+--------
1 | FALSE
2 | FALSE
3 | FALSE
4 | FALSE
5 | FALSE
...
Remplir l' ID_VALUES
tableau. Puis, comme décrit par Erwin, de créer une vue matérialisée qui rend aléatoire l' ID_VALUES
tableau une fois:
CREATE MATERIALIZED VIEW id_values_randomized AS
SELECT id
FROM id_values
ORDER BY random();
Notez que la vue matérialisée ne contient pas l'utilisé de la colonne, parce que cela va rapidement devenir obsolètes. Ni la vue nécessité de contenir d'autres colonnes qui peuvent être dans l' id_values
table.
Afin d'obtenir (et de "consommer") de valeurs aléatoires, utiliser une mise à JOUR-RETOUR sur id_values
, en sélectionnant id_values
de id_values_randomized
avec une jointure, et en appliquant les critères souhaités pour obtenir uniquement des possibilités pertinentes. Par exemple:
UPDATE id_values
SET used = TRUE
WHERE id_values.id IN
(SELECT i.id
FROM id_values_randomized r INNER JOIN id_values i ON i.id = r.id
WHERE (NOT i.used)
LIMIT 5)
RETURNING id;
Variation LIMIT
comme il le faut, si vous avez seulement besoin d'une valeur aléatoire à un moment, le changement LIMIT
de 1
.
Avec le bon index sur id_values
, je crois que la mise à JOUR-le RETOUR doit s'exécuter très rapidement avec peu de charges. Il retourne randomisés valeurs avec une base de données de l'aller-retour. Les critères pour les "admissibles", les lignes peuvent être aussi complexe que nécessaire. Les nouvelles lignes peuvent être ajoutées à l' id_values
table à tout moment, et ils auront accès à l'application dès que la vue matérialisée est actualisé (qui peut être exécuté à une période creuse). Création et actualisation de la vue matérialisée sera lent, mais il ne doit être exécutée lorsque de nouvelles id sont ajoutés à l' id_values
table.