Я хотел бы иметь возможность генерировать случайные bytea
поля произвольной длины (<1 ГБ) для заполнения тестовых данных.
Каков наилучший способ сделать это?
источник
Я хотел бы иметь возможность генерировать случайные bytea
поля произвольной длины (<1 ГБ) для заполнения тестовых данных.
Каков наилучший способ сделать это?
Расширяя ответ Джека Дугласа, чтобы избежать необходимости в зацикливании PL / PgSQL и конкатенации байтов, вы можете использовать:
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';
Это простая SQL
функция, которую дешевле вызывать, чем PL / PgSQL.
Разница в производительности из-за измененного метода агрегации огромна для больших bytea
значений. Хотя исходная функция на самом деле в 3 раза быстрее для размеров <50 байтов, эта функция гораздо лучше масштабируется для больших значений.
Или используйте функцию расширения C :
Я реализовал генератор случайных байтов в виде простой функции расширения Си. Это в моем хранилище скрап-кода на GitHub . Смотрите README там.
Это снижает производительность вышеупомянутой версии SQL:
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);
должно бытьFROM generate_series(1, $1);
. Вы пробовали рекурсию? Мое ограниченное тестирование подразумевает, что это масштабируется лучше:/dev/urandom
в/var/lib/pgsql/data
и читать его сpg_read_file()
бонусным сумасшедшими очками, но , к сожалению ,pg_read_file()
читаюtext
ввод с помощью преобразования кодирования, поэтому он не может читать BYTEA. Если вам действительно нужна максимальная скорость, напишите функциюC
расширения, которая использует быстрый генератор псевдослучайных чисел для получения двоичных данных и оборачивает данные байта вокруг буфера :-)random_bytea
. github.com/ringerc/scrapcode/tree/master/postgresql/…Эта функция сделает это, но 1 Гб займет много времени, потому что она не масштабируется линейно с выходной длиной:
выходной тест:
dbfiddle здесь
источник