我在生产数据库中有数百万条记录(每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)
的东西