Ich möchte in der Lage sein, zufällige bytea
Felder beliebiger Länge (<1 GB) zum Auffüllen von Testdaten zu generieren .
Wie geht das am besten?
quelle
Ich möchte in der Lage sein, zufällige bytea
Felder beliebiger Länge (<1 GB) zum Auffüllen von Testdaten zu generieren .
Wie geht das am besten?
Wenn Sie die Antwort von Jack Douglas verbessern, um PL / PgSQL-Schleifen und die Verkettung von Bytes zu vermeiden, können Sie Folgendes verwenden:
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';
Es ist eine einfache SQL
Funktion, die billiger aufzurufen ist als PL / PgSQL.
Der Leistungsunterschied aufgrund der geänderten Aggregationsmethode ist bei größeren bytea
Werten immens . Obwohl die ursprüngliche Funktion bei Größen <50 Byte bis zu dreimal schneller ist, skaliert diese Funktion bei größeren Werten viel besser.
Oder verwenden Sie eine C-Erweiterungsfunktion :
Ich habe einen Zufalls-Bytea-Generator als einfache C-Erweiterungsfunktion implementiert. Es befindet sich in meinem Scrapcode-Repository auf GitHub . Siehe dort die README.
Es macht die Leistung der obigen SQL-Version zunichte:
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
FROM generate_series(0, $1);
muss seinFROM generate_series(1, $1);
. Haben Sie Rekursion versucht? Meine begrenzten Tests deuten darauf hin, dass dies besser skaliert:/dev/urandom
zu verknüpfen/var/lib/pgsql/data
und zu lesen,pg_read_file()
um verrückte Bonuspunkte zu erhalten, aber leiderpg_read_file()
liest ichtext
Eingaben über eine Codierungskonvertierung, sodass es nicht bytea lesen kann. Wenn Sie wirklich maximale Geschwindigkeit wollen, schreiben Sie eineC
Erweiterungsfunktion, die einen schnellen Pseudozufallszahlengenerator verwendet, um Binärdaten zu erzeugen und ein Bytea-Datum um den Puffer zu wickeln :-)random_bytea
. github.com/ringerc/scrapcode/tree/master/postgresql/…Diese Funktion wird es tun, aber 1 GB wird lange dauern, da es nicht linear mit der Ausgabelänge skaliert:
Ausgangstest:
dbfiddle hier
quelle