将生成的大量测试数据插入postgresql数据库

Inserting large amounts of generated test data into postgresql database

我想将十亿行浮动数据插入到 postgresql 数据库中,以便测试各种 postgis 函数的性能。我下面的努力需要很长时间,而且似乎效率很低,而且内存消耗似乎在膨胀。任何人都可以建议一个更好的方法来做到这一点 - 我认为每次插入插入一百万行会更好但是我无法弄清楚如何构建对象例如:(a, b), (c, d) to insert.

感谢收到的任何帮助。请注意,我是 SQL 的新手,所以我无法消化需要高级 CS 学位才能吸收的超优化解决方案:) 我正在寻找“足够好”。

他,

安德鲁

do $$
declare 
   position float := 0;
   measurement float := 0;
   counting integer := 0;
begin
   while position < 100 loop
      INSERT into lat_longs values (counting, postition);
      position := position + 0.0000001;
      counting := counting + 1;
   end loop;
   raise notice 'count: %', counting;
end$$;

通常使用 generate_series() 比在 PL/pgSQL 中使用循环更快。

要生成“位置”值,您可以使用random()

以下将为第二列插入 1 亿行随机值:

insert into lat_longs(c1, c2)
select g.id, random() * 100
from generate_series(1,100e6) as g(id);

我更喜欢以块的形式插入测试数据(例如一次插入 1000 万条)。如果您让 Postgres 为第一列生成一个唯一值,这会更容易做到,例如通过将其定义为标识列:

create table lat_longs 
(
  c1 bigint generated always as identity,
  c2 float
)

insert into lat_longs(c2)
select random() * 100
from generate_series(1,10e6) as g(id);

insert into lat_longs(c2)
select random() * 100
from generate_series(1,10e6) as g(id);

...

如果你真的需要第二列不断增加,如果你有标识列,你可以这样做:

insert into lat_longs(c2)
select g.position
from generate_series(0, 100, 0.0000001) as g(position);

或者分块进行:

insert into lat_longs(c2)
select g.position
from generate_series(0, 10, 0.0000001) as g(position);

insert into lat_longs(c2)
select g.position
from generate_series(10, 20, 0.0000001) as g(position);

...