将数百万条"dummy"记录加载到 postgresql 数据库中以模拟 PROD 数据库记录计数的最快方法是什么?



我在生产数据库中有数百万条记录(每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类似,以保持某种类型的受控环境,除非有人提出更好的方法。感谢

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

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'); 

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

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

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

最新更新