我正在尝试快速生成一个 100 GB 的 postgres 表。我需要这个关系来预热缓冲区缓存。我尝试过使用 bytea 和文本字段。这使得实际关系较小而 TOAST 表较大。棘手的部分是,由于权限问题,TOAST 表无法加载到缓存中。我想知道是否有人有快速创建这么大表的经验?
我不知道这是否是绝对最快的,但这应该相当不错:
create unlogged table j (x text);
alter table j alter x set storage plain ;
insert into j select repeat('a',4100) from generate_series(1,13107200);
像这样设置存储子句将禁用 TOAST、线外存储和线内压缩。使其不记录将阻止它流式传输到任何副本或 WAL 存档。将其大小设置为超过半页可确保每页仅写入一行。它仍然会消耗主服务器上的存储,但我认为托管服务没有任何办法可以解决这个问题。
您可能希望使用 COPY FREEZE 填充它以避免需要清理,但我认为您无法让它在托管服务上很好地工作。
您可以使用
pgbench
生成虚假银行数据并指定您想要多少数据。它速度快、显示进度、可预测且有据可查。
作为示例,以下命令在我的测试中很快生成了约 62GB 的数据。
pgbench -iq -s 5000 --unlogged -I dtg -U postgres -h my_database_hostname_ip DBNAME
-s
选项是控制生成数据量的缩放因子。根据文档,1X 的比例会生成大约 100K 的数据行。通过实证测试,5000 的规模为我们提供了约 63 GB 的数据。
-I dtg
具体指定了初始化步骤,我们选择跳过真空和索引。如果您确实计划对虚假数据进行更多操作,请随意省略。就我而言,我只是想快速填充数据库以进行 IO 和带宽测试。