【问题标题】:Fastest way to load millions of "dummy" records into postgresql Database to mimic PROD database record count?将数百万“虚拟”记录加载到 postgresql 数据库以模拟 PROD 数据库记录计数的最快方法?
【发布时间】:2021-12-19 14:51:34
【问题描述】:

我在 生产 数据库中有数百万条记录(每 5 个表可能有 1000 万条记录),我想仅使用虚拟数据将它们复制到另一个数据库中,因为我无法真正导出此数据,因为它是 PROD 数据库并且有员工信息。

我现在主要是通过使用 LOOP 和这个查询来插入虚拟数据

DO $$
DECLARE
 table1_id uuid;
 table2_id uuid;
 table3_id uuid;
BEGIN
   FOR counter IN 1..500000 LOOP
 
    INSERT INTO table1 
    VALUES ('random', 'data', 'here') 
    RETURNING id INTO table1_id; 
   
    INSERT INTO table2
    VALUES ('random', 'data', 'here')
    RETURNING id INTO table2_id;
   
    INSERT INTO table3 
     VALUES ('random', 'data', 'here')
    RETURNING id INTO table3_id; 
   
    INSERT INTO table4
    VALUES (random', 'data', 'here'); 
   
    INSERT INTO table5 
    VALUES ('random', 'data', 'here'); 
  
   END LOOP;
END; $$

我知道插入单个记录和迭代非常慢,但我如何能够批量执行此操作?另外,还有比手动加载更好的方法吗?正如我之前所说,将 PROD 数据导出并在此处使用对我来说是不现实的。

我想这样做的原因是 我想用我的一个 API 查询这个新加载的数据库并测试每个查询的延迟时间,但我希望记录数类似于PROD 保持某种类型的受控环境,除非有人提出更好的方法。谢谢

【问题讨论】:

    标签: database postgresql batch-processing loading batch-insert


    【解决方案1】:

    您可以在一条语句中完成所有操作,这很可能是最快的方式:

    with t1 as (
      INSERT INTO table1 
      select 'random', 'data', 'here'
      from generate_series(1,50000)
      RETURNING id
    ), t2 as ( 
      INSERT INTO table2
      select id, 'random', 'data', 'here'
      from t1
      returning id
    ), t3 as (   
      INSERT INTO table3 
      select id, 'random', 'data', 'here'
      from t2
      returning id
    ), t4 as (   
      INSERT INTO table4
      VALUES ('random', 'data', 'here')
    )   
    INSERT INTO table5 
    VALUES ('random', 'data', 'here'); 
    

    【讨论】:

      【解决方案2】:

      这些查询是比随机数据更随意的数据。生成具有正确属性的随机数据以进行实际测试是一门艺术(更不用说它自己的研究领域)

      对于随机数,您可以使用 random(),结合算术对其进行缩放,如果需要,可以使用 floor() 将其转换为整数。如果需要非均匀分布,也可以使用 sqrt() 或 ln() 或 power() 对其进行变换。

      对于随机字符串,您可以使用类似md5(random()::text)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-21
        • 2017-03-15
        • 2011-10-06
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        相关资源
        最近更新 更多