Самый эффективный способ импорта данных в сервис Prisma / PostgreSQL?
У меня запущена служба Prisma (1.14.2), подключенная к базе данных PostgreSQL. Мне нужно вставить множество узлов с отношением "один ко многим" к базе данных PostgreSQL через соединитель Prisma. Прямо сейчас я делаю это следующим образом. 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 раз. Но я хочу избежать обязательного преобразования в нормализованный формат данных (NDF).
Я читал об ускорении INSERT в PostgreSQL в целом, но я не уверен, могу ли я применить это к соединителю Prisma и каким образом.
2 ответа
Круглые обходы (запросы к вашему API, запрос к вашей базе данных и возврат значений) занимают много времени. На самом деле, это, безусловно, занимает больше времени, чем фактический запрос SQL.
Чтобы решить вашу проблему, вам, вероятно, следует пакетировать ваши запросы. Есть много способов сделать это, вы можете использовать пакетный пакет запросов GraphQL или просто сделать это так:
mutation {
q1: createStroke(color: "red") {
id
}
q2: createStroke(color: "blue") {
id
}
}
Помните, что Prisma будет превышать время ожидания запросов более чем на 45 секунд, поэтому вы можете ограничить размер пакетов.
Учитывая n запросов на пакет, он разделит количество циклов на n.
Начиная с версии Prisma 2.20.0, вы сможете использовать
.createMany({})
сейчас же. Вероятно, этот ответ не будет полезным, так как вы спрашивали 3 года назад ...
https://www.prisma.io/docs/concepts/components/prisma-client/crud#create-multiple-records