我在 PostgreSQL 16 中有 IMDb 数据库,我正在尝试为性能基准生成随机字符串。相关表title_basics
带有主键列tconst
,VARCHAR(9)。tconst
具有“tt0000000”形式的值,其中零代表数字,例如“tt0000001”和“tt9999999”。
我想写一个可以用 pgbench 运行的 .sql 文件,它生成随机的、填充的数字附加在字符串 'tt' 之后,例如:
SELECT * FROM title_basics WHERE tconst = 'tt0000001';
对于简单的 SQL,这将是微不足道的,但由于 pgbench 仅支持少量标量函数,这似乎很困难。我还探索了 pgbench 脚本中 SQL 的使用,但似乎不支持这样的构造:
\set random_number (SELECT random());
或者:
\set random_number :randint(0, 9999999)
\set padding_length 7 - length(:'random_number')
\set primary_key 'tt' || repeat('0', :'padding_length') || :'random_number'
我还考虑过使用 SQL 生成数字,但这有效地阻止了 PostgreSQL 在 tconst 上使用索引。我不想创建额外的索引来满足查询,因为由于其他原因这会产生问题。
SELECT *
FROM title_basics
WHERE tconst = 'tt' || LPAD((FLOOR(RANDOM()*(9916880 - 1 + 1)) + 1)::text, 7, '0');
编辑:
我发现了一个在 CTE 中生成随机值的功能性解决方案。这不会阻止 PostgreSQL 在 tconst 上使用索引。但是,我很高兴看到一种更面向 pgbench 的方法。
WITH a AS (
SELECT 'tt' || LPAD((FLOOR(RANDOM()*(9916880 - 1 + 1)) + 1)::text, 7, '0') AS tconst_random
)
SELECT *
FROM title_basics, a
WHERE tconst = a.tconst_random;