我有一个Prisma(1.14.2)服务正在运行,该服务已附加到PostgreSQL数据库。我需要通过Prisma连接器插入许多与PostgreSQL数据库具有一对多关系的节点。现在,我以以下方式进行操作。 strokes
和samples
数组包含许多节点:
for (let strokeIndex = 0; strokeIndex < painting.strokes.length; strokeIndex++) {
const stroke = painting.strokes[strokeIndex];
const samples = stroke.samples;
const createdStroke = await PrismaServer.mutation.createStroke({
data: {
myId: stroke.id,
myCreatedAt: new Date(stroke.createdAt),
brushType: stroke.brushType,
color: stroke.color,
randomSeed: stroke.randomSeed,
painting: {connect: {myId: jsonPainting.id}},
samples: { create: samples }
}
});
}
对于128个笔划和每个笔划128个样本(即总共16348个样本)这大约需要38秒。
我想知道是否有办法加快这一过程?特别是由于笔画和样本的数量会更高。我可以使用prisma import ...
,它显示出6倍的加速。但我想避免转换为Normalized Data Format (NDF)。
我读过有关加快PostgreSQL in general中的INSERT的信息,但是我不确定是否以及如何将其应用于Prisma连接器。
答案 0 :(得分:0)
往返(查询您的API,查询您的数据库并返回值)需要很多时间。 实际上,它肯定比实际的SQL查询花费更多的时间。
要解决您的问题,您可能应该批处理您的查询。有很多方法可以执行此操作,您可以使用GraphQL查询批处理程序包,也可以像这样简单地进行操作:
mutation {
q1: createStroke(color: "red") {
id
}
q2: createStroke(color: "blue") {
id
}
}
请记住,Prisma will time out queries taking longer than 45s,因此您可能希望限制批次的大小。
给出n每批查询的数量,它将往返次数除以n。
答案 1 :(得分:0)
从 Prisma 版本 2.20.0 开始,您现在应该可以使用 .createMany({})
。
自从您 3 年前问过以来,这个答案可能没有帮助...
https://www.prisma.io/docs/concepts/components/prisma-client/crud#create-multiple-records