【问题标题】:Inserting large amounts of generated test data into postgresql database将大量生成的测试数据插入postgresql数据库
【发布时间】:2021-05-08 09:29:00
【问题描述】:

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

感谢您的任何帮助。请注意,我对 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$$;

【问题讨论】:

  • 您在此处显示的任何内容都不会导致内存使用量激增。表上有约束或触发器吗?

标签: sql postgresql postgis


【解决方案1】:

通常使用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);

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 2014-12-29
    • 2011-03-09
    • 1970-01-01
    • 2012-10-06
    • 2021-03-31
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多