Saya ingin dapat menghasilkan bytea
bidang acak dengan panjang acak (<1Gb) untuk mengisi data uji.
Apa cara terbaik untuk melakukan ini?
sumber
Saya ingin dapat menghasilkan bytea
bidang acak dengan panjang acak (<1Gb) untuk mengisi data uji.
Apa cara terbaik untuk melakukan ini?
Meningkatkan jawaban Jack Douglas untuk menghindari perlunya perulangan PL / PgSQL dan bytea, Anda dapat menggunakan:
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';
Ini adalah SQL
fungsi sederhana yang lebih murah untuk dipanggil daripada PL / PgSQL.
Perbedaan dalam kinerja karena metode agregasi yang diubah sangat besar untuk bytea
nilai yang lebih besar . Meskipun fungsi aslinya sebenarnya hingga 3x lebih cepat untuk ukuran <50 byte, yang satu ini jauh lebih baik untuk nilai yang lebih besar.
Atau gunakan fungsi ekstensi C :
Saya telah mengimplementasikan generator bytea acak sebagai fungsi ekstensi C sederhana. Itu ada di repositori scrapcode saya di GitHub . Lihat README di sana.
Itu nukes kinerja versi SQL di atas:
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);
perluFROM generate_series(1, $1);
. Sudahkah Anda mencoba rekursi? Pengujian terbatas saya menunjukkan bahwa skala ini lebih baik:/dev/urandom
ke/var/lib/pgsql/data
dan membacanya denganpg_read_file()
bonus poin gila, tetapi sayangnyapg_read_file()
membacatext
input melalui konversi pengkodean, sehingga tidak dapat membaca bytea. Jika Anda benar-benar menginginkan kecepatan maksimal, tulislahC
fungsi ekstensi yang menggunakan generator nomor acak pseudo-acak untuk menghasilkan data biner dan bungkus bytea datum di sekitar buffer :-)random_bytea
. github.com/ringerc/scrapcode/tree/master/postgresql/…Fungsi ini akan melakukannya, tetapi 1Gb akan memakan waktu lama karena tidak skala secara linear dengan panjang output:
tes keluaran:
Aku di sini
sumber