Postgresql

如何生成隨機字節

  • March 24, 2020

我希望能夠生成bytea任意長度(<1Gb)的隨機欄位來填充測試數據。

這樣做的最佳方法是什麼?

增強 Jack Douglas 的回答以避免需要 PL/PgSQL 循環和 bytea 連接,您可以使用:

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對於較大的值,由於更改聚合方法導致的性能差異是巨大的。儘管對於小於 50 字節的大小,原始函式實際上快了 3 倍,但對於較大的值,這個函式的擴展性要好得多。

或使用 C 擴展函式

我已經實現了一個隨機 bytea 生成器作為一個簡單的 C 擴展函式。它位於我在 GitHub 上的 scrapcode 儲存庫中。請參閱那裡的自述文件。

它會破壞上述 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

引用自:https://dba.stackexchange.com/questions/22512