web-dev-qa-db-fra.com

Comment puis-je générer un bytea aléatoire

J'aimerais pouvoir générer des champs aléatoires bytea de longueur arbitraire (<1 Go) pour la population de données de test.

Quelle est la meilleure façon de faire ça?

Améliorer la réponse de Jack Douglas pour éviter la nécessité de la mise en boucle PL/PGSQL et la concaténation de BYTEA, vous pouvez utiliser:

CREATE OR REPLACE FUNCTION random_bytea(bytea_length integer)
RETURNS bytea AS $body$
    SELECT decode(string_agg(lpad(to_hex(width_bucket(random(), 0, 1, 256)-1),2,'0') ,''), 'hex')
    FROM generate_series(1, $1);
$body$
LANGUAGE 'sql'
VOLATILE
SET search_path = 'pg_catalog';

C'est une fonction simple SQL qui est moins chère à appeler que PL/PGSQL.

La différence de performance due à la méthode d'agrégation modifiée est immense pour les plus grandes valeurs bytea. Bien que la fonction d'origine soit réellement maximale de 3 fois plus rapide pour les tailles <50 octets, celle-ci échelle beaucoup mieux pour les valeurs plus importantes.

ou utilisez une fonction d'extension C :

J'ai mis en place un générateur de BYTEA aléatoire en tant que fonction de poste C simple. C'est dans mon référentiel de scrapode sur github . Voir le README là-bas.

Il nouie la performance de la version SQL ci-dessus:

regress=# \a
regress=# \o /dev/null
regress=# \timing on
regress=# select random_bytea(2000000);
Time: 895.972 ms
regress=# drop function random_bytea(integer);
regress=# create extension random_bytea;
regress=# select random_bytea(2000000);
Time: 24.126 ms
20
Craig Ringer